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

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

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

1.kNN代码

import numpy as np
import operator

def 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]为其他值











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值