您的位置:首页 > 编程语言 > Python开发

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={} #新建一个字典

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) 



>>> 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