python33 kNN算法的详细解释

虽然了解过python,但是numpy和operator还是第一次使用,虽然知道knn算法的操作步骤,但是刚开始看这个算法还是不太能明白每一行代码的作用滴。所以要记录下来啦:
首先是kNN算法python33
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    
    diffMat = tile(inX, (dataSetSize,1)) - dataSet  
    sqDiffMat = diffMat**2   #
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()      
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
##################################################################################################
首先 函数参数解释(inX, dataSet, labels, k)其中inX是要进行分类的输入向量, dataSet是已经存在的训练样本集矩阵, labels与dataSet每一行对应的标签 组成的向量, k是用于对inX进行排序的总体计算结果中的前k个(经过排序的前k个)

接下来是每行的解释
##################################################################################################
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]       #dataSet的行数
    diffMat = tile(inX, (dataSetSize,1)) - dataSet   #通过tile把inX的单行向量扩展到和dataSet同样的行数,然后将inX与样本集中的每行做差,得到差矩阵(这是为了进行计算欧氏距离)
    sqDiffMat = diffMat**2   #每行的分量计算平方值
    sqDistances = sqDiffMat.sum(axis=1) #每行进行求和(axis=0是列)
    distances = sqDistances**0.5   #对每个分量开方(这就得到了inX与dataSet中的每个训练集的欧氏距离)
    sortedDistIndicies = distances.argsort()返回升序排序后的结果,返回的是distances的分量的下标,下标从0开始      
    classCount={} #字典          
    for i in range(k):   #range(k)返回[0,1,...k-1]
        voteIlabel = labels[sortedDistIndicies[i]]   #取得排序数据(原数据的下标)所对应的标签
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1   #对出现的标签进行计数,当classCount中没有对应的'key'为voteIlabel时,返回0
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #在python2中使用 iteritems()以迭代器对象返回字典键值对 但是我现在用的是python3.3所以python中的dict么有了iteritems(),但是有items()返回只读类集合对象,所以使用items(),然后 按照第二个元素的顺序排序  按照逆序排序,
    return sortedClassCount[0][0]   #返回最终inX所应该属于的标签(取得的k个递增数据所对应的标签通过上面的步骤进行了每个标签的数量统计,最终获得了标签逆序排序,其中sortedClassCount[0][0]就是k个中出现频率最高的那个标签sortedClassCount[0][1]是对应的频次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值