《机器学习实战》学习笔记1

来源:互联网 发布:又拍云存储 域名 编辑:程序博客网 时间:2024/05/18 00:44

此学习笔记是基于《机器学习实战》中的内容所写的,虽然不是什么大神,但是还是写出来和大家分享,希望能有帮助。如果文章中有什么错误,也敬请指正。此外,有些代码其实现在我也不太理解,所以没有写出来,如果有什么问题希望大家能一起讨论,一起进步。

更多内容见书2.1.2 实施kNN分类算法

1.kNN代码

import numpy as npimport operatordef classify0(inX,dataSet,labels,k):    dataSetSize=dataSet.shape[0]    diffMat=np.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):        votelIlabel=labels[sortedDistIndicies[i]]        classCount[votelIlabel]=classCount.get(votelIlabel,0)+1    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]def createDateSet():    group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels=['A','A','B','B']    return group,labels


以下是我在理解这段代码时的笔记

1.shape[0]返回的是行数(shape[1]返回列数)

在理解shape函数时,我参考了http://blog.csdn.net/by_study/article/details/67633593

在group中,是一个4*2矩阵,行数为4,即dataSetSize=4

 group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

2.tile函数

参考文章https://jingyan.baidu.com/article/219f4bf7da4d8dde442d389e.html

假设输入向量inX为(x0,y0),那么tile函数做了这个工作,化为[[x0,y0],[x0,y0],[x0,y0],[x0,y0]]

diffMat=np.tile(inX,(dataSetSize,1))-dataSet

即为[[x0-1.0,y0-1.1],[x0-1.0,y0-1.0],[x0-0,y0-0],[x0-0,y0-0.1]]


3.sum函数

sqDistances=sqDiffMat.sum(axis=1)

anis=0表示按行求和,anis=1表示按列求和

>>> np.sum([[0, 1], [0, 5]], axis=0)array([0, 6])>>> np.sum([[0, 1], [0, 5]], axis=1)array([1, 5])

因此此时执行的是(x0-1.0)^2+(y0-1.1)^2,……以此类推


4.argsort函数

sortedDistIndicies=distances.argsort()

该函数的作用是将数组中的各个元素从小到大排列,提取出索引值并输出新的数组

参考文章http://www.cnblogs.com/yyxf1413/p/6253995.html

到这一步位置,已经计算出当前点与所有数据点的距离并将这些距离从小到大排列出来

接下来

 for i in range(k):
        votelIlabel=labels[sortedDistIndicies[i]]  #确定前k个点所对应的标签        classCount[votelIlabel]=classCount.get(votelIlabel,0)+1    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]  #返回发生频率最高的元素标签


5.sorted函数以及operator.itemgetter函数

参考文章1.http://www.cnblogs.com/100thMountain/p/4719503.html

参考文章2.http://www.cnblogs.com/zle1992/p/6271105.html

6.iteritems函数

参考文章http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html


最后在python开发环境中输入下列命令:

>>> import kNN
>>>group, labels = kNN.createDataSet()
上述命令创建了变量group和labels,在python命令提示符下,输入变量名字以检验是否正确定义变量(如下图)
最后,输入
>>>kNN.classify0([0,0],group,labels,3)

输出结果应该为B,大家也可以改变输出[0,0]为其他值