本文最后更新于 2019年11月17日 已经是 1291天前了 ,文章可能具有时效性,若有错误或已失效,请在下方留言。
邻近算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
from 百度百科
实现例程:
import operator
import numpy as np
def creatDateSet():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])#创建一个数组
labels = ['A','A','B','B']
return group,labels
def classify0(inX, dataSet, labels, k):
#inX是待分类的样本,dataset为数据集,labels为样本数据对应的标签,k为距离
dataSetSize = dataSet.shape[0]#第一维的个数(多少行)
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
#将inX重复1次形成datasetsize行的数组,与原来的dataset的坐标差值
sqDiffMat = diffMat**2#坐标差的平方
sqDistances = sqDiffMat.sum(axis = 1)#距离的平方
distances = sqDistances**0.5#距离
sortedDistIndicies = np.argsort(distances)#返回的数组从小到大排序后对应的数组索引
x=0
for i in sortedDistIndicies:
if distances[i]<=k:
x+=1
classCount={}#创建字典
for i in range(x):
voteIlabel = labels[sortedDistIndicies[i]] #距离为k以内的点分别是哪一类
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#{'B': 2, 'A': 1}统计了最近的k个点分别有多少属于哪类
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)#按字典内容降序排列
return sortedClassCount[0][0]
def main():
group,labels = creatDateSet()
a = eval(input('请输入2维待分析样本: '))
k = eval(input('请输入K(距离): '))
result = classify0(a, group ,labels,k)
print(result)
if __name__ == '__main__':
main()
结果:
请输入2维待分析样本: [1,1]
请输入K(距离): 1.0
A
Press any key to continue . . .
未完待续…
{{koubi}}