首页 > 代码库 > Python学习之k-近邻算法

Python学习之k-近邻算法

1. K-近邻算法

 

 1 # coding=utf-8
 2 from numpy import * 
 3 import operator
 4 
 5 def createDataSet():
 6     group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
 7     labels = [A,A,B,B]
 8     return group,labels
 9 
10 def classify(inX,dataSet,labels,k):
11     dataSetSize = dataSet.shape[0]
12     diffMat = tile(inX,(dataSetSize,1))-dataSet
13     sqDiffMat = diffMat**2
14     sqDistances = sqDiffMat.sum(axis=1)
15     distances = sqDistances**0.5
16     # 返回值所在的索引
17     sortedDistIndices = distances.argsort()
18     classCount={}
19     for i in range(k):
20         # 根据索引获取其对应的类别标签
21         voteIlabel = labels[sortedDistIndices[i]]
22         classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
23     print classCount
24     sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
25     return sortedClassCount[0][0]
26 
27 def main():
28     (group,labels)=createDataSet()
29     print classify([0.8,1.5],group,labels,3)
30 
31 if __name__=="__main__":
32     main()

 k-近邻算法的整体流程为:

  (1) 计算已知类别数据集中的点与当前点之间的距离;
  (2) 按照距离递增次序排序;
  (3) 选取与当前点距离最小的k个点;
  (4) 确定前k个点所在类别的出现频率;
  (5) 返回前k个点出现频率最高的类别作为当前点的预测分类

  classify() 函数有 4 个输人参数 : 用于分类的输入向量inX,输入的训练样本集dataSet,标签向量labels,最后的参数k表示用于选择最近邻近的数目,其中输入向量的元素数目和矩阵dataSet的行数相同,首先计算向量和矩阵向量元素之间的距离,然后按照从小到大的顺序对结果进行排序,确定前 k 个距离最小元素所在的主要分类(输入参数k总正整数);最后,将classCount字典分解为元组列表,然后使用程序第二行导入运算符模块的itemgetter方法 ,按照classCount字典的第二个元素的次序对元组进行排序。此处的排序为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签,即就是输入向量所属分类。

  最近正在看《机器学习实战》,顺便汇总一下其中的小例子,书籍很好,推荐大家阅读!

Python学习之k-近邻算法