KNN(python实现)

kNN算法流程


一般情况下,kNN有如下流程: 
(1)收集数据:确定训练样本集合测试数据; 
(2)计算测试数据和训练样本集中每个样本数据的距离;

常用的距离计算公式: 
欧式距离公式:d(x,y)=∑ni=1(xi−yi)2−−−−−−−−−−−−√d(x,y)=∑i=1n(xi−yi)2 
曼哈顿距离公式:d(x,y)=∑ni=1|xi−yi|d(x,y)=∑i=1n|xi−yi|
(3)按照距离递增的顺序排序; 
(4)选取距离最近的k个点; 
(5)确定这k个点中分类信息的频率; 
(6)返回前k个点中出现频率最高的分类,作为当前测试数据的分类。

 

主要代码:

from numpy import *
import operator

#定义KNN算法分类器函数
#函数参数包括:(测试数据,训练数据,分类,k值)
def classify(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() #排序并返回index
    #选择距离最近的k个值
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        #D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #排序,降序
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

注:

  • 这里用到矩阵运算,计算测试样本和每个训练样本之间的L2距离
  • KNN存在的不足是,每次对一个样本进行预测时,都要对整个训练样本做一次测距,耗时严重;
  • 因此,对应的KD-Tree就能很好的解决这个问题,不用遍历所有样本,即可求得距离coor点最近的K个点的序号。详细过程可参考前面的文章 “KD-Tree的C++实现”

 

参考资料:https://blog.csdn.net/moxigandashu/article/details/71169991

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值