KNN(k-NearestNeighbor)

news/2024/7/5 5:03:04

最近工作中用到求邻近点的方法,于是用上了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]

// Mat ind, dis;
// cv::flann::Index Kdtree;
// Kdtree.build(pc1, cv::flann::KDTreeIndexParams(1), cvflann::FLANN_DIST_EUCLIDEAN);
// Kdtree.knnSearch(PC, ind, dis, 1, cv::flann::SearchParams(-1));


http://lihuaxi.xjx100.cn/news/247071.html

相关文章

数学学习指南

基础数学学习地图 北京大学数学与应用数学双学位的学分要求 参考文献 Mathematics | MIT OpenCourseWare | Free Online Course Materials我想业余时间系统学习数学&#xff0c;想求一份学习地图&#xff0c;请问我应该该怎么学习呢&#xff1f;学习哪些 和教程呢&#xff1f;…

基于注解的设计模式

2019独角兽企业重金招聘Python工程师标准>>> http://alexradzin.blogspot.com/2013/01/annotation-based-design-patterns.html 转载于:https://my.oschina.net/heatonn1/blog/204789

python中列表和集合_15个例子掌握Python列表,集合和元组

Python中的一切都是对象。每个对象都有自己的数据属性和与之关联的方法。为了有效和恰当地使用一个对象&#xff0c;我们应该知道如何与它们交互。列表、元组和集合是三种重要的对象类型。它们的共同点是它们都被用作数据结构。为了创建健壮且性能良好的产品&#xff0c;必须非…

iOS开发系列--通知与消息机制

http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态&#xff0c;如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制&#xff0c;其包括两类&a…

Lynx技术分析-JS引擎扩展设计

JS Binding 技术 Lynx&#xff08;一个高效的跨平台框架&#xff09; 的 JS Binding 技术最主要的目的是搭建一个高效的与 JS 引擎解耦的通信桥梁&#xff0c;同时具备 JS 引擎切换的能力。该技术经历了多次迭代&#xff0c;最终通过抽象的引擎接口层设计&#xff0c;在代码层面…

3D Point Cloud Library install

3D PCL的安装具体可看官方GitHub&#xff1a; 链接 我根据官方的操作&#xff0c;“from ._pcl import *”屡次出现错误&#xff0c;最终原因是没加入OPENNI. 如上图所示&#xff0c;将OpenNI2.dll加入pcl的安装路径即可 successd&#xff01;

电动车逆变器的基础知识

一般来说&#xff0c;电动车使用三相电机&#xff0c;这需要复杂的电压波形进行电力推进。电池提供固定电压的直流电。因此&#xff0c;逆变器通过在加速时将直流转换为交流电&#xff0c;并在制动&#xff08;再生&#xff09;时将交流电转换为直流电&#xff0c;从而生成适合…

python 多线程日志切割+日志分析

楼主最近刚刚接触python&#xff0c;还是个小菜鸟&#xff0c;没有学习python之前可以说楼主的shell已经算是可以了&#xff0c;但用shell很多东西实现起来还是不可能的事情&#xff0c;例如最明显的一点大日志分析&#xff0c;由于楼主的公司&#xff0c;每天的日志量很大&…