KNN算法[K-近邻]学习笔记
《机器学习实战》例子笔记
简单demo及学习注释
from numpy import *
import operator #运算符模块
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
datasetSize = group.shape[0]
inX = [0,0] #待分类点
diffMat = tile(inX,(datasetSize,1)) - group #为什么要这样做? [[x1-x0,y1-y0],[x2-x0,y2-y0],...]
sqDiffMat = diffMat**2 #为什么要这样做? [(x-x0)^2,(y-y0)^2]
sqDiffMat.sum(axis=1) #每行求和 [(x1-x0)^2+(y1-y0)^2,(x2-x0)^2+(y2-y0)^2,...]
sqldistance = sqDiffMat.sum(axis=1)
distances = sqldistance**0.5 #开平方 [((x1-x0)^2+(y1-y0)^2)^0.5,((x2-x0)^2+(y2-y0)^2)^0.5,...]
distances #该列表中储存所有已分类点对当前带分类点的距离
sortedDistIndicies = distances.argsort() # 返回排序后(升续)的下标,表示已分类点距离待分类点由近到远的排序(距离越近,相似度越高)
classCount = {} #找出距离最近的几个点,找相同label累加计数最多的(即判定当前待分类点最相似类别)
for i in range(2):
votelabel = labels[sortedDistIndicies[i]]
classCount[votelabel] = classCount.get(votelabel,0) + 1 #分类计数加一,同一类则value+1,否则家里新的分类即新的key(label),value+1
print(sorted(classCount.items(),
key=operator.itemgetter(1),reverse=True)[0][0])
[Out] B
即(0,0)点按照KNN算法以及和已知label的点分类的结果为B类别。
其中已分类点如表所示
x | y | label | |
---|---|---|---|
0 | 1.0 | 1.1 | A |
1 | 1.0 | 1.0 | A |
2 | 0.0 | 0.0 | B |
3 | 0.0 | 0.1 | B |
求距离公式为:
distance = ((X-X0)^2+(Y-Y0)^2)^0.5
另外还需要注意的是在dict的get方法:
def get(self, k, d=None): # real signature unknown; restored from __doc__
""" D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. """
pass