一、算法

1、kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。

最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据。对于新的数据则直接和训练数据匹配,假设存在同样属性的训练数据,则直接用它的分类来作为新数据的分类。这样的方式有一个明显的缺点,那就是非常可能无法找到全然匹配的训练记录。

kNN算法则是从训练集中找到和新数据最接近的k条记录。然后依据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。

2、代表论文

Discriminant Adaptive Nearest Neighbor Classification

Trevor Hastie and Rolbert Tibshirani

IEEE TRANSACTIONS ON PAITERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 18, NO. 6, JUNE 1996

http://www.stanford.edu/~hastie/Papers/dann_IEEE.pdf



3、行业应用

客户流失预測、欺诈侦測等(更适合于稀有事件的分类问题)



二、算法要点



1、指导思想

kNN算法的指导思想是“近朱者赤,近墨者黑”。由你的邻居来判断出你的类别。



计算过程例如以下:

    1)算距离:给定測试对象,计算它与训练集中的每一个对象的距离

    2)找邻居:圈定距离近期的k个训练对象。作为測试对象的近邻

    3)做分类:依据这k个近邻归属的主要类别,来对測试对象分类



2、距离或相似度的衡量

什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。

觉的距离衡量包含欧式距离、夹角余弦等。

对于文本分类来说。使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适。



3、类别的判定

投票决定:少数服从多数。近邻中哪个类别的点最多就分为该类。

加权投票法:依据距离的远近。对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)



三、优缺点



1、长处

简单。易于理解。易于实现,无需预计參数,无需训练

适合对稀有事件进行分类(比如当流失率非常低时,比方低于0.5%,构造流失预測模型)

特别适合于多分类问题(multi-modal,对象具有多个类别标签),比如依据基因特征来推断其功能分类,kNN比SVM的表现要好



2、缺点

懒惰算法,对測试样本分类时的计算量大。内存开销大,评分慢

可解释性较差,无法给出决策树那样的规则。



四、常见问题



1、k值设定为多大?

k太小,分类结果易受噪声点影响;k太大,近邻中又可能包括太多的其他类别的点。(对距离加权,能够减少k值设定的影响)

k值一般是採用交叉检验来确定(以k=1为基准)

经验规则:k一般低于训练样本数的平方根



2、类别怎样判定最合适?

投票法没有考虑近邻的距离的远近,距离更近的近邻或许更应该决定终于的分类,所以加权投票法更恰当一些。



3、怎样选择合适的距离衡量?

高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。

变量值域对距离的影响:值域越大的变量经常会在距离计算中占领主导作用,因此应先对变量进行标准化。



4、训练样本是否要一视同仁?

在训练集中,有些样本可能是更值得依赖的。

能够给不同的样本施加不同的权重,加强依赖样本的权重。减少不可信赖样本的影响。

5、性能问题?

kNN是一种懒惰算法,平时不好好学习,考试(对測试样本分类)时才临阵磨枪(暂时去找k个近邻)。

懒惰的后果:构造模型非常easy。但在对測试样本分类地的系统开销大,由于要扫描所有训练样本并计算距离。

已经有一些方法提高计算的效率,比如压缩训练样本量等。

6、是否能大幅降低训练样本量,同一时候又保持分类精度?

浓缩技术(condensing)

编辑技术(editing)



參考:

维基百科:

http://zh.wikipedia.org/wiki/%E6%9C%80%E9%82%BB%E8%BF%91%E6%90%9C%E7%B4%A2

百度百科:http://baike.baidu.com/view/1485833.htm

KNN它可以用来推荐:

在这里,我们没有KNN为了实现分类,我们使用KNN最原始的想法算法,每一个内容搜索K它的一个最相似内容。并给用户推荐。

最新文章

  1. SMP、NUMA、MPP(Teradata)体系结构介绍
  2. Ubuntu jdk安装
  3. web报表移动端如何进行移动设备绑定与撤销
  4. Robot Framework测试框架学习笔记
  5. ToolBar Style
  6. CURL与PHP-CLI的应用【CLI篇】
  7. tomcat环境变量配置
  8. 【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move
  9. 转:GraphicsMagick介绍及安装
  10. 【转】在写一个iOS应用之前必须做的7件事(附相关资源)
  11. iOS Layer CABasicAnimation
  12. a标签的背景图在ie8下不显示的问题
  13. lightoj1030(期望dp)
  14. [Q]无矩形外框块参照图形的识别
  15. ActionBarSherlock,SlidingMenu
  16. CLR VIA C#: 基元类型、 引用类型 和 值类型
  17. Confluence安装&破解&汉化
  18. 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)
  19. 从此不再担心键盘遮住输入框OC(
  20. python中Properties的一些小用法

热门文章

  1. 使用exchange普通表模式被切换到分区表
  2. Notepad++ 删除空行
  3. POJ 2996 & 2993 国际象棋布局 模拟
  4. DevExpress XtraReports 入门四 创建 Web 报表
  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
  6. 140724夏训.txt
  7. DevExpress中获取RichTextEdit中RichEditControl的两种方式
  8. hdu 4864 Task(贪婪啊)
  9. 电商指尖---(9).net发展Solr中间Facet特征
  10. Swift入门教程:基本运算符