kNN python 註釋

本文深入讲解KNN算法的实现过程,包括数据集创建、距离计算、分类决策等关键步骤,并探讨了Python中numpy库的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代碼:
#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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值