26-史上最简单的分类算法——KNN

Posted on 2017-10-22 20:07  LoveAI  阅读(1805)  评论(0编辑  收藏  举报

今晚本来良心发现,连改了5、6个积累已久的潜在BUG以及需要效率优化的代码,改完已经8点了,才发现说好的机器学习笔记没写。不过还好是KNN,很友好很简单,松了一口气,大家就当休息一下换换脑子吧。

 

KNN算法的定义:

 

KNN通过测量不同样本的特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

 

下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。


由此也说明了KNN算法的结果很大程度取决于K的选择。

 

KNN算法的好处在于新数据进来,分类器可以马上学习并适应,但是计算成本也是线性增长,存储也是问题。

 

数学中的几个距离概念:

 

先上图比较直观:下图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。

 

1. 欧氏距离

最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为:

 

(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

 

(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

 

(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

 

也可以用表示成向量运算的形式:

 

2. 曼哈顿距离

我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈顿距离为: 要注意的是,曼哈顿距离依赖座标系统的转度,而非系统在座标轴上的平移或映射。 

 

通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,此即曼哈顿距离名称的来源, 同时,曼哈顿距离也称为城市街区距离(City Block distance)。

 

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离 

 

 

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离 

   

 

3. 切比雪夫距离

若二个向量或二个点p 、and q,其座标分别为,则两者之间的切比雪夫距离定义如下:

    这也等于以下Lp度量的极值:,因此切比雪夫距离也称为L∞度量。

 

    以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。

    在平面几何中,若二点p及q的直角坐标系坐标为,则切比雪夫距离为:

 

    玩过国际象棋的朋友或许知道,国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。(此处可在草稿纸上推导)

 

(1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离 

 

 

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离   

 

 

这个公式的另一种等价形式是 

  (2^5=32,3^5=243……只能帮到这了)

 

4. 闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离,而是一组距离的定义。

(1) 闵氏距离的定义       

两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为: 

 

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离       

根据变参数的不同,闵氏距离可以表示一类的距离。 

 

理论基础打好了,下面演示如何使用sklearn中的KNN算法(还是万年不变的标准化后的鸢尾花数据集):

 

 

 

 

如何选择 k 是一个重点,并且需要标准化数据。例子中用到的minkowski distance (闵可夫斯基距离)是普通的 Euclidean (欧式距离)和 Manhattan distance (曼哈顿距离) 的扩展。

 

下周学习如何度量分类算法的性能好坏(Scoring metrics for classification),敬请期待:)