python版本3.6.5
k-近邻算法 范例及详解
目的
输入一个坐标,返回最邻近该坐标的标签
创建数据集
创建训练数据集如图所示
def createDataSet():
group = array([[1, 1.1], [1, 1], [0, 0], [0, 0.1]])
labels = array(['A', 'B', 'C', 'D'])
return group, labels
实现kNN
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat = tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortArr=distances.argsort()
classCount={}
for i in range(k):
vateIlabel = labels[sortArr[i]]
classCount[vateIlabel] = classCount.get(vateIlabel, 0) + 1
sortedCloassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedCloassCount[0][0]
代码详解:
1、定义一个方法,参数为 需要判断的坐标,数据集,数据集标签,邻近
2、获取数据集的大小
3、创建一个数组 ,长度为数据集大小,元素为inX:
In[3]:tile([0.3,1],(4,1))
Out[3]:
array([[0.3, 1. ],
[0.3, 1. ],
[0.3, 1. ],
[0.3, 1. ]])
并用返回的该数组 减去 数据集,得到差值:
In[8]: tile([0.3,1],(4,1))-dataSet
Out[8]:
array([[-0.7, -0.1],
[-0.7, 0. ],
[ 0.3, 1. ],
[ 0.3, 0.9]])
4、将上边得到的差值数组平方:
In[9]: (tile([0.3,1],(4,1))-dataSet)**2
Out[9]:
array([[0.49, 0.01],
[0.49, 0. ],
[0.09, 1. ],
[0.09, 0.81]])
5、将集合的每个子集合进行求和,得到平方和:
In[10]: ((tile([0.3,1],(4,1))-dataSet)**2).sum(axis=1)
Out[10]: array([0.5 , 0.49, 1.09, 0.9 ])
6、再开根号
In[11]: ((tile([0.3,1],(4,1))-dataSet)**2).sum(axis=1)**0.5
Out[11]: array([0.70710678, 0.7 , 1.04403065, 0.9486833 ])
7、对上边开完根号的集合排序,返回从小到大元素的索引:
In[12]: (((tile([0.3,1],(4,1))-dataSet)**2).sum(axis=1)**0.5).argsort()
Out[12]: array([1, 0, 3, 2], dtype=int64)