KNN-k 近邻算法
KNN属于分类算法,原理比较简单,简单概括就是对测试数据和所哟样本点进行距离的测算,最后选取K个最近的点的集合, 在其中选取类别出现最多的点的分类作为测试数据的分类。
以图说明,这里存在矩阵
trainMat = array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
作图:
当我们的测试点(x1,y1)分别计算和这些店的距离之后,选出k个最小距离点之后,统计这k个点哪个类别的点最多就选这个类别, 很简单吧。
KNN代码实现:
def KNN_classify(testmat,dataset,labels,k):
dataSetSize = dataset.shape[0]
#求两点间的距离公式
diffMat = tile(testmat,(dataSetSize,1)) - dataset
sqdiffMat = diffMat ** 2
sqdistance = sqdiffMat.sum(axis=1)
distance = sqdistance ** 0.5
sortdistance = distance.argsort() #排序
print sortdistance
classcount = {}
#统计前k个数据的类别出现次数
for i in range(k):
votelabel = labels[sortdistance[i]]
classcount[votelabel] = classcount.get(votelabel,0) + 1
sortedclass = sorted(classcount.iteritems(),key = operator.itemgetter(1),reverse=True)
return sortedclass[0][0]
使用上面的训练数据进行新数据的分类测试
xData = array([[ 1., 1.1],
[ 1.,1. ],
[ 0.,0. ],
[ 0., 0.1],
[ 1., 2. ],
[ 3., 2. ],
[ 0.5, 0.8]])
yLabel = array([1,1,-1,-1,1,1,-1])
分别测试两个数据点
xinx1 = array([[0.,0.2]])
xinx2 = array([[5,2]])
print KNN_classify(xinx1,xData,yLabel,4)
print KNN_classify(xinx2,xData,yLabel,4)
得到结果
-1
1