机器学习实战第二章kNN代码清单2-1详细注释

# -*- coding: cp936 -*-
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

#inX:用于分类的输入向量
#dataSet:训练样本集
#labels:标签向量
#k:用于选择最近邻居的数目

def classify0(inX,dataSet,labels,k):
         dataSetSize=dataSet.shape[0]#shape函数的功能是查看矩阵或数组的维数,也就是说知道有几个训练数据,所以shape[0]表示得到数组的行数,它在这里是4
         diffMat=tile(inX,(dataSetSize,1))-dataSet#tile()函数是numpy模块中的函数,它将原来的一个数组,扩充成了4个一样的数组。diffMat得到了目标与训练数值之间的差值
         sqDiffMat=diffMat**2#diffMat中的每一个元素(上一行代码计算出来的目标数据集与每个训练数据集的各个特征值(这里只有两个)之间的差值)进行平方
         sqDistance=sqDiffMat.sum(axis=1)#把上一行代码中的平方项按’列‘(?sqDiffMat数组的第一列加第二列)进行相加
         distance=sqDistance**0.5#开根号,计算出距离啦!
  
         sortedDistIndicies=distance.argsort()#升序排列,得到一个升序排列的矩阵,argsort函数返回的是数组值从小到大的索引值
         
         #下面进行选择距离最小的k个点
         classCount={}#这是一个字典,用于计数,即用于存储不同标签(labels)出现的次数
         for i in range(k):
                  voteIlabel=labels[sortedDistIndicies[i]]
                  #从前面已经排好序的矩阵中选择距离最小的k个点并获得这k个点所对应的标签,也就是前k个点,k是你在使用时具体输入的,书上k是3,所以就提炼出了前3个训练数据集的标签
                  #sortedDistIndicies[i]是索引值,正好与label的值的索引是对应的
                  classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#classCount[voteIlabel]是个变量名,别多想,然后voteIlabel是前k个,也就是距离最小的k个训练数据集所对应的标签(labels),现在利用dict.get(key, default=None)函数来统计这k个的标签出现的次数,key就是dict中的键voteIlabel,如果不存在则返回一个0并存入dict(这里的dict就是classCount),如果存在则读取(get)当前值(标签),并在classCount中加1
         #最后得到的classCount{}应该是类似这种样子的:classCount{'A':3,'B':0}

         #排序
         sortedClassCount=sorted(classCount.iteritems(),#这里使用了sorted()函数sorted(iterable, cmp=None, key=None, reverse=False),iteritems()将classCount这个dict分解为元组列表(两个),(一个list包含两个tuple):[('B', 2), ('A', 1)] 
                  key=operator.itemgetter(1),reverse=True)#operator.itemgetter(1)表示按照第二个元素的次序对元组进行排序,因为编程语言的index(索引)从0开始
         return sortedClassCount[0][0]#返回出现次数最多的的标签,这也就是最终的分类(label)结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值