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

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

2018-01-16 21:02 197 查看
# -*- 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)结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: