KNN(k-NearestNeighbor)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_43061687/article/details/82051530

最近工作中用到求邻近点的方法,于是用上了knn.


KNN概述
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
KNN是通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
算法的优点:
1.简单,易于理解,易于实现,无需估计参数,无需训练
2.适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
3.特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好
算法的不足:
1.当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
2.计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
3. 懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢

相关代码

def knn(src,dst):
    neigh = NearestNeighbors(n_neighbors=1)
    neigh.fit(src[:,0:2]) #模板点
    distances, indices = neigh.kneighbors(dst[:,0:2]) #求取距离与索引
    for i,dis in enumerate(distances):
        # if dis <0.02 and abs(dst[i,2]-src[indices[i],2])>0.005:
        dst[i,2]=src[indices[i],2]

猜你喜欢

转载自blog.csdn.net/weixin_43061687/article/details/82051530