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

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

from numpy import *
import operator
from os import listdir

def 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矩阵中的第一行第一列(或者说第一个元组中的第一个值)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值