一、算法实施过程
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的K个点;
(4)确定前K个点所在类别的出现频率;
(5)返回前K个点出现频率最高的类别作为当前点的预测分类。
二、Python代码实现
from numpy import *
import operator
def createDataSet():
group=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):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet //1
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)//2
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()//从小到大排序
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 //3
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)//sorted为排序函数
return sortedClassCount[0][0]
if __name__=="__main__":
group,labels=createDataSet()
className=classify0([0,0],group,labels,3)
print(className)
1、tile函数:
numpy.tile([1,1],[2,3])=([1,1],[1,1],[1,1]
[1,1],[1,1],[1,1])
第一个参数是要生成的数,第二个参数控制要生成的行数与列数。
2、xx.sum()
x = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
print x.sum()
print x.sum(axis=0)
print x.sum(axis=1)
结果分别是:36, [9 12 15], [ 3 12 21]
3、xx.get(x,'',xx)
第一个参数为的查找关键字,若找不到则返回第二个参数。