Machine Learning in Action机器学习——第二章k-近邻算法代码详解

Posted lee&jim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Machine Learning in Action机器学习——第二章k-近邻算法代码详解相关的知识,希望对你有一定的参考价值。

一、近邻算法的定义与作用也就是意义

k-近邻算法,近邻算法近邻算法顾名思义,找到最近的点然后进行归纳,距离哪些点最近这个点就属于那个类。这和线性回归算法有异曲同工之妙,但是我感觉还是一元线性回归算法更加精准。(有兴趣的小伙伴可以参阅《西瓜书》与《南瓜书》),当然就方便来说,可能k-近邻算法更加方便并且容易理解。

一般的,k-近邻算法可以应用的范围特别广,因为他本身就是一个分类问题。在书中介绍的就是有电影分类、择偶、识别手写数字。

二、近邻算法的代码详解

1、实施分类算法

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # 代表的是dataSet数据集中的行数
    diffMat = tile(inX,(dataSetSize, 1)) - dataSet  # 计算未知类的数据集与已知数据集的差
    sqDiffMat = diffMat**2  # 差值平方化
    sqDistances = sqDiffMat.sum(axis=1)  # 把(未平方根化之前的)未知数据集与两个已知数据的距离分别计算出来
    distances = sqDistances**0.5  # 距离平方根化
    sortedDistIndicies = distances.argsort()  # 排序,返回下标
    classCount = {}  # 建立一个新的字典以便于之后将数据归纳其中
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]  # 遍历排序后的前 k 个标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 记录这 k 个标签出现的次数
    sortedClassCount = sorted(classCount.items(),  key=operator.itemgetter(1), reverse=True)  # 按照出现次数对标签进行从大到小排序
    return sortedClassCount[0][0]  # 返回出现次数最多的那个标签

参数含义 

inX代表的是所需要分类的对象,也就是用于分类的输入向量

dataSet代表的是inX要被分类出来的依据对象,是依据dataSet这个数据组才把inX分为那些类,也就是书上的输入的训练样本集

labels也就是dataSet所对应的标签,比如说爱情片、恐怖片这种,用于将最多的标签复制给inX的标签,最后作为一个返回值。

k代表所抽取的前几个元素,进行分类之后会将标签与数据集依次排序排序之后的前k个元素中哪个标签所占数目比较多,就将inX分为这个标签。

到这里kNN的大概意思应该就解释清楚了(书中后面列举的是具体的实例),下面看具体的函数作用。

函数解析

shape:在这里用shape[0]来读取这个dataSet数据集的行数

tile:在这里用tile是将inX汇聚成dataSize行一列的数据集,因为矩阵的运算规律需要我们这么做。

sum:sum(axis=1)其中axis=1的意思是,将每一行的元素加起来,然后再进行接下来的开方。

argsort:就是分类函数了,对distance进行排序

sorted:对于classCount.items()进行排序,排序依据是operater(也就是classCount.item)的第二个元素,也就是上面循环中求出的每个标签的数字。从大到小进行排序。

难点解析

    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]  # 遍历排序后的前 k 个标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 记录这 k 个标签出现的次数

在这个循环之中,有一个问题,labels如何和以及分类排序之后的数据集找到一一对应的关系。所以上面使用了一个argsort函数

函数的具体效果如上图,这样根据大小排列之后,dataSet的标签依旧不会改变。也就解决了上述问题。

三、总结

以上就是kNN分类算法的大体解析,实例介绍我们放在之后的讲解中。

上面都是我学习之中遇到的一些困难以及疑惑,如果小伙伴们还有其他的问题也欢迎私信我进行交流。

代码出处出自于机器学习实战这本书中,其中对于python3.X与python2.X的不同进行了一些调整,例如:

python2与3的变动
python2python3
print “”print("")
iteritems()items()

 

以上是关于Machine Learning in Action机器学习——第二章k-近邻算法代码详解的主要内容,如果未能解决你的问题,请参考以下文章

DataSet in Machine Learning

machine learning in action Record

用10张图来看机器学习Machine learning in 10 pictures

决策树(chap3)Machine Learning In Action学习笔记

What Machine Learning Have In Store For Normal People?

Interesting Applications in Machine Learning and Computer Vision