Ch2,KNN分类算法程序分析----机器学习实践P19页

来源:互联网 发布:美工助理工资一般多少 编辑:程序博客网 时间:2024/06/07 17:38

此文是对机器学习实践P19页的代码分析
1,建立一个group组,每行有两个特征(或称属性),建立一个标签labels,存放组对于的目标变量。

from numpy import *import operatorfrom os import listdirdef createDataSet():    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A','A','B','B']    return group, labels

2计算要输入的值(或矢量vector)与group组中的每个值之间的距离
我们以取classify0([0,0],group,labels,3)为例为例

def classify0(inX, dataSet, labels, k):#取classify0([0,0],group,labels,3)为例    dataSetSize = dataSet.shape[0]     #dataSet是4x2矩阵,shape[0]获取行数=4       diffMat = tile(inX, (dataSetSize,1)) - dataSet    '''    建立一个4x2的零矩阵,并用此矩阵减group矩阵    >>> diffMat    array([[-1. , -1.1],       [-1. , -1. ],       [ 0. ,  0. ],       [ 0. , -0.1]])    '''    sqDiffMat = diffMat**2    '''    矩阵取平方    >>> diffMat**2    array([[ 1.  ,  1.21],       [ 1.  ,  1.  ],       [ 0.  ,  0.  ],       [ 0.  ,  0.01]])    '''    sqDistances = sqDiffMat.sum(axis=1)    '''    每个矩阵的行分别求和(axis=0则列相加)    >>> sqDistances    array([ 2.21,  2.  ,  0.  ,  0.01])    '''    distances = sqDistances**0.5    '''    求平方根得到距离    >>> distances    array([ 1.48660687,  1.41421356,  0.        ,  0.1       ])

3,以上已经得到输入的数[0,0]与group的距离,kNN算法即要找出这些距离中最小的那些数

 sortedDistIndicies = distances.argsort()    '''    从小到大将对应的索引值排序:    >>> sortedDistIndicies    array([2, 3, 1, 0], dtype=int32)    '''    classCount={}              for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        '''        因为k=3,即取出了前三个距离最小的数对应的索引值       e.g.如取i==0时,则,sortedDistIndicies[0]==2,labels[2]=='B'       so, voteIlabel == 'B'       '''        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1        '''       get可以获取键对应的值,这里key==voteIlabel== 'B',因为classCount是空字典       所以'B'没有对应的值,返回默认值0,因此:       >>> classCount[voteIlabel]        1        值得注意的是voteIlabel已经变成B,所以上面的含义是classCount('B')==1        然后循环i=1,voteIlabel==labels[3]==B;classCount['B']==classCount.get(B,0)+1==1+1==2        因为此时classCount已经有值,即,classCount={'B':1}        i==2,voteIlabel==labels[1]==A;classCount['A']==0+1==1        so:        >>> classCount        {'B': 2, 'A': 1}        >>>         这里实际上Count就是计数的意思,也就是说距离最小的这三个数中,有两个的目标变量是'B',        目标变量是'A'的有一个,因此显然我们输入的这个数的目标变量选'B'会更好       '''    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)    '''    以第二个域逆向排序,即以目标变量的数量来从大到小排序    >>> sortedClassCount    [('B', 2), ('A', 1)]    '''    return sortedClassCount[0][0]    '''    返回sortedClassCount矩阵中的第一行第一列(或者说第一个元组中的第一个值)
原创粉丝点击