kNN python 註釋
2017-11-15 20:33
211 查看
代碼:
#coding=utf8 from numpy import * import operator def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #这里就是二维数组,在座標軸裏表示四個點 labels=['A','A','B','B'] #與上面四個點 一一對應的類別 return group,labels def classify0(inX,dataSet,labels,k): #inX是預測分類“坐标”,dataSet是上面createDataSet的array,就是已经有的,分类过的坐标,label是相应分类的标签,k是KNN,k近邻里面的k dataSetSize=dataSet.shape[0] #dataSetSize是sataSet的行数,shape[0]是行,[1]是列,用上面的举例就是4行 diffMat=tile(inX,(dataSetSize,1))-dataSet #前面用tile是重複生成,inX是二維數組化,datesize是生成的數組行數,1是列的倍數,然后再减去dataSet,是为了求两点的距离,先要坐标相减,这个就是坐标相减 sqDiffMat=diffMat**2 #上一行得到了坐标相减,然后这里要(x1-x2)^2,要求乘方 sqDistances=sqDiffMat.sum(axis=1) #axis=1是行相加,=0是列,这样得到了(x1-x2)^2+(y1-y2)^2 distances=sqDistances**0.5 #开根号,这个之后才是距离 sortedDistIndicies=distances.argsort() #argsort是排序,将元素按照由小到大的顺序返回下标,比如([3,1,2]),它返回的就是([1,2,0]) classCount={} #生成一個字典 在下面循環裏儲存 類別和類別個數get()那條命令 for i in range(k): voteIlabel=labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #get是取字典里的元素,如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,这个点是哪个类别哪个类别就加1 soredClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #iteritems()是講一個字典一以列表形式返回,key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(A和B是第0个;1和2是第一個)。reverse=True是降序排序 return soredClassCount[0][0] #返回类别最多的类别
classCount.get 从字典中取值,key为voteIlabel,如果没有返回0,如果有就加1
这段程序可以理解为将labels中第sortedDistIndicies[i]个东西存在字典中,并且提取的次数也存在了字典中
operator.itemgetter函数
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子。a = [1,2,3]
>>> b=operator.itemgetter(1) //定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b=operator.itemgetter(1,0) //定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(2, 1)
要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
sorted函数
Python内置的排序函数sorted可以对list或者iterator进行排序,官网文档见:http://docs.python.org/2/library/functions.html?highlight=sorted#sorted,该函数原型为:sorted(iterable[, cmp[, key[, reverse]]])
参数解释:
(1)iterable指定要排序的list或者iterable,不用多说;
(2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:
students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这样写:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda student : student[2])
(3)key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下:
sorted(students, key=lambda student : student[2])
key指定的lambda函数功能是去元素student的第三个域(即:student[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。
有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写:
sorted(students, key=operator.itemgetter(2))
sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写:
sorted(students, key=operator.itemgetter(1,2))
即先跟句第二个域排序,再根据第三个域排序。
(4)reverse参数就不用多说了,是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为Tr
iteritems()返回一个迭代器
b = a.iteritems() list(b) =[('a',1),('b',3)] for k,v in b: print k,v 返回a 1 b 3
相关文章推荐
- Python实现knn
- KNN邻近算法与python实践
- 机器学习实战——python实现knn算法
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- kNN原理及Python代码实现
- python实现knn算法
- K最近邻结点算法(k-Nearest Neighbor algorithm)KNN——python简单实现
- KNN 算法 python 实现
- kNN算法python实现和简单数字识别
- K近邻(knn)算法简介及用python实现
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- K-邻近算法(kNN)python3.X
- 机器学习与数据挖掘-K最近邻(KNN)算法的实现(java和python版)
- 机器学习KNN python算法实现
- 【Python-ML】SKlearn库K近邻(KNN) 使用
- python 实现 kNN 算法
- 坐标KNN聚类python实例
- Python实现KNN算法
- Python实现的knn算法示例
- Python实现KNN算法