代码笔记--kNN算法

伪代码:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

实际的python代码:

def classify0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]
    diffMat=tile(inX,(dataSetSize,1))-dataSet   #将输入向量转化为二维数组,重复次数为dataSetSize
    sqDiffMat=diffMat**2    #距离计算
    sqDistances=sqDiffMat.sum(axis=1)   #按列相加
    distances=sqDistances**0.5  #开根号
    sortedDistIndices=distances.argsort()
    classCount={}   # 字典
    for i in range(k):  # 选择距离最小的k个点
        voteIlabel=labels[sortedDistIndices[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1   #统计前k个点所在类别的出现次数
    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #按出现次数降序
    return sortedClassCount[0][0]   #返回出现次数最多的类别

代码解释:
classify0()函数有4个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量为labels,最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。
计算完所有点之间的距离后,可以对数据按照从小到大的次序排序。然后没确定前k个距离最小元素所在的主要分类,输入k总是正整数;最后,将classCount字典分解为元组列表,然后使用程序第二行导入运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序。此处的排序为逆序,即按照从大到小次序排序,最后返回发生频率最高的元素标签。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值