KNN算法属于有监督学习中的分类算法
算法原理:
1 计算未知点与已知点的距离
2 列出前K个与此未知点最近的已知点(已经归好类有标签)
3 统计此K个中出现最多次数的归类并把未知点归为此类。
实例:
有4个带标签的点
[0,10] A
[0,8] A
[10,0] B
[7,0] B
求未知点[9,6]应该归为哪类
python实现如下:
from numpy import *
import operator
from os import listdir
def createDataSet():
group = array([[0,10],[0,8],[10,0],[7,0]])
labels = ['A','A','B','B']
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]#查看有几行标签
print('dataSetSize',dataSetSize)
diffMat = tile(inX, (dataSetSize,1)) - dataSet #每行复制一个未知点-每个已知点
print('diffMat\n',diffMat)
sqDiffMat = diffMat**2 #得到的差进行平方消除负数
sqDistances = sqDiffMat.sum(axis=1) #把每个点得到的两个数如(25,16)进行相加得到 41
distances = sqDistances**0.5 #每个进行开方
print('distances',distances)
sortedDistIndicies = distances.argsort() #按大小进行标号0 1 2 3...
print('sortedDistIndicies',sortedDistIndicies)
classCount={}
for i in range(k):
#按上面的距离的远近已经标上号的如[2,1,0,3]对应ABCD 按CBAD排序
voteIlabel = labels[sortedDistIndicies[i]]
print('voteIlabel',voteIlabel)
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #统计各标签出现的次数
# 把字典按出现频率排序变成二维向量
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
# 返回排最前的那个的标签
return sortedClassCount[0][0]
group,labels = createDataSet()
print(classify0([9,6],group,labels,3))
运行结果: