“近朱者赤,近墨者黑”的分类算法——k最近邻算法

k最近邻算法是一种经典的机器学习分类算法,最早由Cover T和Hart P于1967年提出。对原论文感兴趣的读者可下载此论文Nearest neighbor pattern classification

算法概念

k最近邻,英文名为k-Nearest Neighbor,简称为kNN,是一种极其简单的机器学习分类算法,甚至可能是最简单的分类算法。其中,k表示样本的邻居数。k最近邻算法思想可以形象地归纳为一句话,“少数服从多数”。它没有训练过程,是“懒惰学习”的著名代表。所谓“懒惰学习”,就是在模型的训练阶段只是记录了训练样本,省略了显式的训练过程,待收到测试样本(待分类样本)时直接对其进行分类的学习方法的统称。对“懒惰学习”感兴趣的读者可参考文献Lazy learning

算法思想


“近朱者赤,近墨者黑”的分类算法——k最近邻算法

上图中有三种点,其中绿色方块与红色三角已知其类别,分别为1与-1,蓝色圆点类别未知。根据“少数服从多数”的分类原则,如果k=3,则蓝色圆点的邻居有1个绿色方块和2个红色三角,因此蓝色圆点类别被确定为-1;如果k=5,则蓝色圆点的邻居有3个绿色方块和2个红色三角,因此蓝色圆点类别被确定为1。

算法过程

从上述的简述中,不难看出,k最近邻分类算法的核心就是k的选择与如何寻找样本的邻居。k的选择视情况而定,一般在3~20之间,在此不再赘述。而寻找样本的邻居实际上就是寻找与样本相似的样本。样本在空间中可被表示为一个点,而样本间的相似性,可以通过计算样本间的“距离”进行表示。距离与相似性成反相关关系。因此,寻找样本的邻居的流程如下:

  1. 选取某一相似性度量函数,如欧几里得距离,曼哈顿距离等;

  2. 根据选定的相似性度量函数计算待分类样本与其他样本之间的距离;

  3. 计算完毕后,按照距离的大小进行排序(升序),选取前k个样本,即为该样本的邻居。

常用相似性度量函数

从上述关于k最近邻算法思想的简述中不难看出,相似性度量函数是至关重要的。以下列举了几种常用相似性度量函数。

  • 欧几里得距离

    d(x,y)=k=1n(xkyk)2

    其中,n是x和y的维度,xkyk分别是x和y上第k个分量的值。

  • 曼哈顿距离

    d(x,y)=k=1n|xkyk|

    其中,n是x和y的维度,xkyk分别是x和y上第k个分量的值。

  • 闵可夫斯基距离

    d(x,y)=(k=1n|xkyk|r)1r

    其中,n是x和y的维度,xkyk分别是x和y上第k个分量的值。,r是参数。注意,n与r不同,n是向量的维度,r是空间的维度。此外,细心的读者可能已经发现,当r=1时,闵可夫斯基距离距离即为曼哈顿距离;当r=2时,闵可夫斯基距离距离即为欧几里得距离。

算法优缺点

俗话说得好,人无完人,而算法本身也有各自的优缺点。至于k最近邻算法,则其优缺点如下:
1. 优点
* k最近邻思想简单易懂,实现难度低,无需训练。

  1. 缺点
    • 在分类时,k最近邻必须计算待分类样本与全体样本的距离,计算量大,需要消耗很长的时间。
    • 当样本不平衡时,k最近邻的分类结果会偏向于样本数量多的类别。