kNN算法 k-Nearest Neighbors algorithm

来源:互联网 发布:银行卡数据采集器 编辑:程序博客网 时间:2024/05/29 07:37

对照着书中的代码,自己有一定的python基础,但是会的比较简单,参考网上的python教程,推荐一下

廖雪峰先生的网站,http://www.liaoxuefeng.com/

#我用的是win10 因为官网上的numpy是32位的,下载了安装不靠谱,用的python **install也不行,所以参考了下面的方法

http://blog.csdn.net/hechenghai/article/details/47703079 如果出现pip的问题,是配置不对,

http://www.crifan.com/run_pip_install_django_error_pip_is_not_recognized_as_an_internal_or_external_command_operable_program_or_batch_file/



from numpy import *

import operator


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

def classify0(inX, dataSet, labels, k):#inX为目标点, dataSet为搜集的4个点, labels为已经分类好的AB, k为前k个最近的点
    dataSetSize = dataSet.shape[0]#返回dataSet的行数,即搜集了几个数据
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet#tile(list, list2)list是待操作list, list2是要复制的方式
    sqDiffMat = diffMat**2#对每一个数字平方
    sqDistances = sqDiffMat.sum(axis = 1)#axis=1是对每一行做加法 即 平方和
    #print sqDistances
    distances = sqDistances**0.5 #开平方
    #print "distances", distances
    sortedDistance = distances.argsort() #升序排列,获得距离从近到远的排序,返回的是序号
    #print 'sortedDistance', sortedDistance
    #return sortedDistance
    classCount={}#一个空的字典
    for i in range(k):
        voteIlabel = labels[sortedDistance[i]]#voteIlabel是labels中最近的第一个字母
        #print 'voteIlabel', voteIlabel, "-----" ,classCount
        classCount[voteIlabel] = classCount.get(voteIlabel, 0 ) + 1 #get函数 如果查voteIlabel不存在字典中,取0,存在就+1

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

#operator.itemgetter(1)应该是区标号为1的值 iteritems是为字典序列化, reverseTrue是默认false 升序


    return sortedClassCount[0][0] #返回数组

    
#asdf
group, labels = createDataSet()
print group, labels
print classify0([0,0], group, labels, 4)

  #当k=4的时候是没有意义的,因为k=4的时候会对数组中的数据自动排序,A会跑到前面,

  #因为sorted()是按照第字典的第二个数据排序的,当4个都检查完毕的时候,会把A放在前面

#我用的是win10 因为官网上
0 0