王权富贵:《机器学习实战》第二章重点

第二章:

这里的重点是几个python的用法:

1.获得排序索引值。                 sortedDistIndicies = distances.argsort()   

2.是创建字典来计数。             classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1         

3.根据不同域来排序。             sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

4.第2和第3点可以组合在一起构成一个多数表决器

详细程序如下:

inX是输入向量[0,0],dataSet是训练数据[[0,0],[9,9],[0,1]],labels是对应标签[a,b,a],k是取前几个高频率出现的类别这里取2。

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet

PS:tile(A,reps)把数据重复多少遍的意思。

tile(inX, (dataSetSize,1))=tile([0,0], (3,1))=[[0,0],[0,0],[0,0]]


    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)           PS:axis=1是行相加的意思
    distances = sqDistances**0.5                        PS:到这步骤完成了欧式距离的计算
    sortedDistIndicies = distances.argsort()       

PS:这边argsort()是从小打到排列,不打乱原本顺序,只取出它的索引值。

一开始原本数据就就对应标签,现在数据还是对应标签。


    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1         

PS:这里get(voteIlabel,0) + 1  是获得字典key对应的value。

如果字典没有对应key就创建一个key初始为0然后+1,如果有就+1。

比如一开始k=0(相当于1),inX[0,0]对应距离最小的是dataSet中的[0,0]对应标签为a。这里classCount[]={a:1}。

接下来k=1(相当于2),inX距离dataSet第二小的点是[0,1]对应标签是a。这里classCount[]={a:2}。

这里的k就是选取多少个最近的点,把他们对应的标签个数统计出来,下面做多数表决。


    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

PS:这里是按域排序operator.itemgetter(1)对应的就是字典里面value的域。(0对应的是key的域)。这里排序完就相当于多数表决。


    return sortedClassCount[0][0]

猜你喜欢

转载自blog.csdn.net/a1103688841/article/details/87887297
今日推荐