机器学习 in action 分类器0 python代码解析

KNN (K最近邻接算法)python 语言下的简单实现

Machine Learning in Action 给出第一个小例子---最简单的分类器

 

只涉及最简单的向量知识,主要是python语言实现过程中有不理解的地方。

书中源代码如下


运行代码需要用到 numpy和 operator 模块,numpy一般要自行下载装载,用于代数操作。

 

dataSet.shape[0]得到的是训练集中向量(以向量中不同数据表示事物特征)的个数,如训练集为a(array类型)含有四个向量,(1,0)(1,1)(0,0)(0,2),则a.shape[0]=4。

在numpy中,设array(a)的维数为n,则其中一个向量为(X0,X1,X2,….Xn),a.shape[0]得到的是向量X0的维数,a.shape[n]得到向量Xn的维数。若维数为2,则shape[0],shape[1]分别得到array的行数和列数。

如:

>>> a=ones((2,3,4))

>>> a

array([[[ 1.,  1., 1.,  1.],

       [ 1.,  1.,  1., 1.],

       [ 1.,  1.,  1., 1.]],

 

      [[ 1.,  1.,  1., 1.],

       [ 1.,  1.,  1., 1.],

       [ 1.,  1.,  1., 1.]]])

>>> a.shape[0]

2

>>> a.shape[1]

3

>>> a.shape[2]

4

 

 

tile(inX, (dataSetSize,1)) 得到的是dataSetSize个的inX,使用到tile函数。tile函数将inX按后面括号中的要求复制,(dataSetSize,1)可以理解为复制dataSetSize行 1列。括号中可以推广至多维。

 

如:

>>> a

array([[1, 2],

      [3, 4]])

>>> tile(a,(2,1))

array([[1, 2],

      [3, 4],

      [1, 2],

      [3, 4]])

>>> tile(a,(2,1,1))

array([[[1, 2],

       [3, 4]],

 

      [[1, 2],

       [3, 4]]])

>>> tile(a,(2,3,4))

array([[[1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4],

       [1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4],

       [1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4]],

 

      [[1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4],

       [1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4],

       [1, 2, 1, 2, 1, 2, 1, 2],

       [3, 4, 3, 4, 3, 4, 3, 4]]])

 

代码中使用diffMat=tile。。。计算了待分类样本与训练集的距离,相当于:

array1=([[x, x], [x, x], [x, x], [x, x]])

array2=([[1, 0], [1, 1], [0, 0], [0, 2]])

其中每个向量直接相减。

diffMat**2 得到相减后的平方。

再使用 sum(axis=1)得到一个array中第二维所有项的和的少一维的array,维数为2时,正好是把所有向量的项相加,得到只有行数的向量。axis=1 可以理解为 维数为1的项不考虑了,取消维数1,将相应的项相加。

如 (1,2),(3,4),(5,6),(7,8),有二维(需要两个坐标,即两项的向量确定一个值),向量(X0,X1)可以确定一个值,(2,1)可以确定3。axis=1求sum,此时维数是2,则(axis有0,1)对应(X0,X1),不考虑axis=1,则axis=0不变,将1+2,3+4,。。得到(3),(7),(11),(15)的array,完成求和。

代码中,则可以得到样本与训练集的距离了。

 

 

distances.argsort() 中的argsort()函数,用于操作distances的array,可以将维数为1的distances里的元素从小到大排列,得到一个对应原来的元素的顺序的排列。

a为[100,400,999,44,68],a.argsort()返回一个[3,4,0,1,2]的序列。

 

classCount 用于计算样本对于K个训练数据的分类情况,统计属于哪个分类。

建立空的“字典”classCount,接下来是K个循环。循环对每个距离结果分类,并统计各个分类的数量(通过+1实现)

首先,sortedDistIndices[i]是对应的argsort得到的大小序列,再通过labels[sortedDistIndices[i]]得到从小到大的数据对应的分类,将分类名给到voteIlabel。classCount[voteIlabel]=创建出“分类”对应的字典中的值。classCount.get(voteIlabel,0)作用是返回字典中的值,若voteIlabel已经存在,则取出voteIlabel对应的值(分类次数)加1。若voteIlabel不存在,则此次已经创建出了,并且对应值返回0(即括号逗号后的值)加1 。则循环k次后可以统计完毕。

 

最后一行长长的函数意思是将classCount中的值排序,最大的排在最前面,此时得到一个从大到小排列后的字典,‘Romance’:10,‘Action’:2,则[0][0]取出最前的字典条目中的左边的名称,即对应的分类类型。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值