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字典的第二个元素的次序对元组进行排序。此处的排序为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签,即就是输入向量所属分类。
最近正在看《机器学习实战》,顺便汇总一下其中的小例子,书籍很好,推荐大家阅读!
时间: 2024-10-15 04:04:54