机器学习实战Machine Learning In Action 中的KNN代码详细解释

Author:王磊
email: [email protected]
注:一起学习。

首先,是构造一个分类器函数classify0(),代码如下:

def classify0(inX, groups, lables, key):
    dataSetSize = groups.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - groups
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(key):
        voteLable = lables[sortedDistIndicies[i]]
        classCount[voteLable] = classCount.get(voteLable, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

groups.shape[0]
获取groups数组行数,参数0代表行,1代表列。不传参数返回数组的(行,列)

diffMat = tile(inX, (dataSetSize, 1)) - groups
利用tile()函数来构造一个dataSetSize行的inX数组,参数中的inX为将要用来构造数组的原始数据,后面的元组(dataSetSize,1)就是指定这个数组的大小了,tile()函数的第二个参数可以有整形、元组两种选择。

sqDistances = sqDiffMat.sum(axis=1)
将sqDistances数组中的每行中的元素求和,sum()函数中的参数axis=1代表行相加,axis=0代表列相加

sortedDistIndicies = distances.argsort()
argsort()为排序函数,这个排序函数的返回值是每个元素的索引

classCount[voteLable] = classCount.get(voteLable, 0) + 1
字典的get()函数,第一个参数为你想要在字典中查找的字母,第二个参数是人为设定的一个值,这里设定了是0。如果在字典中找到了这个字母,则返回的是这个字母所对应的value值,如果没有找到就返回你设定的这个值0,在第一次查找过程中因为字典是空的,所以找不到,返回时设定值0,然后加1,这样此时的字母对应的value就是1了。在下次查找时,如果你找到了这个字母,那它返回的就是它对应的value值1了,然后在加1,此时这个字母对应的value又成了2,以此类推。(这个函数真是太美妙了,这就是python代码的简洁优美特性了吧。)

sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
classCount.iteritems()就是将字典迭代化,意思就是字典可以迭代了,就是可以for循环了。
key=operator.itemgetter(1)就是按字典中的第二个元素进行排序
reverse=True,True代表降序排序,False升序,默认False

你可能感兴趣的:(机器学习)