下面的代码是在python3中运行,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Tue Jul 3 17:29:27 2018 4 5 @author: Administrator 6 """ 7 8 from numpy import * #NumPy 9 import operator #运算符模块 10 11 def createDataSet(): #这个只是导入数据的函数 12 group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #这个是4行2列的数组 13 labels=['A','A ','B','B'] 14 return group ,labels 15 16 def classify0 (inX,dataSet,labels,k) : #这个是k近邻算法的实现,要注意传入的参数有哪些. 17 #1,用于分类的输入向量inX;2,输入的训练样本集dataSet;3,标签向量labels;4,最后的参数k用于选择最近邻居的数目; 18 dataSetSize=dataSet.shape[0] #其中标签向量的元素数目和矩阵dataSet的行数相同. 19 diffMat=tile(inX,(dataSetSize,1))-dataSet #这里是调用了numpy的函数,tile diffMat已经是数组了 下面就是一些算法了(欧式距离的算法). 这里就是数组运算了,为了避免使用过多的for,这样可能会提升运行速度? 20 sqDiffMat=diffMat**2 #对数组diffMat的每个元素进行平方. python的写法就是这样简单. 21 sqDistances=sqDiffMat.sum(axis=1) #axis=1,表示的是按行相加. axis=0表示按列相加. 22 distances=sqDistances**0.5 #这个是开平方 23 sortedDistIndicies=distances.argsort() #返回的是从小到大的索引.关于变量的建立,还是把我不准,这个直接给了个变量名,并没有标注类型[],比如最小的数据是在第3个位置,就是2,那么第一个元素值就是2 24 classCount={} 25 for i in range(k): #这里可以认为是投票算法,要弄清它的输入和输出是什么. 26 voteIlabel=labels[sortedDistIndicies[i]] #确定前k个距离最小的主要分类,sortedDistIndicies[i]其实返回的是样本的位置, 27 classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 28 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #把'iteritems'改成了tiems,就可以在python3上运行了. 29 return sortedClassCount[0][0] #返回发生频率最高的,标签,,,,注意,这里返回的是标签,其实我们一直想要得到的也是某个东西的标签.返回的是我们想要的东西. 30 31 32 33 34 35 group,labels=createDataSet() 36 print(group) 37 print(labels) 38 39 a=classify0([0,0],group,labels,3) 40 print(a)
运行结果