k最近邻算法是一种经典的机器学习分类算法,最早由Cover T和Hart P于1967年提出。对原论文感兴趣的读者可下载此论文Nearest neighbor pattern classification。
算法概念
k最近邻,英文名为k-Nearest Neighbor,简称为kNN,是一种极其简单的机器学习分类算法,甚至可能是最简单的分类算法。其中,k表示样本的邻居数。k最近邻算法思想可以形象地归纳为一句话,“少数服从多数”。它没有训练过程,是“懒惰学习”的著名代表。所谓“懒惰学习”,就是在模型的训练阶段只是记录了训练样本,省略了显式的训练过程,待收到测试样本(待分类样本)时直接对其进行分类的学习方法的统称。对“懒惰学习”感兴趣的读者可参考文献Lazy learning。
算法思想
上图中有三种点,其中绿色方块与红色三角已知其类别,分别为1与-1,蓝色圆点类别未知。根据“少数服从多数”的分类原则,如果k=3,则蓝色圆点的邻居有1个绿色方块和2个红色三角,因此蓝色圆点类别被确定为-1;如果k=5,则蓝色圆点的邻居有3个绿色方块和2个红色三角,因此蓝色圆点类别被确定为1。
算法过程
从上述的简述中,不难看出,k最近邻分类算法的核心就是k的选择与如何寻找样本的邻居。k的选择视情况而定,一般在3~20之间,在此不再赘述。而寻找样本的邻居实际上就是寻找与样本相似的样本。样本在空间中可被表示为一个点,而样本间的相似性,可以通过计算样本间的“距离”进行表示。距离与相似性成反相关关系。因此,寻找样本的邻居的流程如下:
-
选取某一相似性度量函数,如欧几里得距离,曼哈顿距离等;
-
根据选定的相似性度量函数计算待分类样本与其他样本之间的距离;
-
计算完毕后,按照距离的大小进行排序(升序),选取前k个样本,即为该样本的邻居。
常用相似性度量函数
从上述关于k最近邻算法思想的简述中不难看出,相似性度量函数是至关重要的。以下列举了几种常用相似性度量函数。
-
欧几里得距离
d ( x , y ) = ∑ k = 1 n ( x k − y k ) 2 d(x,y)=\sqrt{\sum_{k=1}^{n}(x_k-y_k)^2} d(x,y)=k=1∑n(xk−yk)2
其中,n是x和y的维度, x k x_k xk和 y k y_k yk分别是x和y上第k个分量的值。 -
曼哈顿距离
d ( x , y ) = ∑ k = 1 n ∣ x k − y k ∣ d(x,y)=\sum_{k=1}^{n}|x_k-y_k| d(x,y)=k=1∑n∣xk−yk∣
其中,n是x和y的维度, x k x_k xk和 y k y_k yk分别是x和y上第k个分量的值。 -
闵可夫斯基距离
d ( x , y ) = ( ∑ k = 1 n ∣ x k − y k ∣ r ) 1 r d(x,y)=(\sqrt{\sum_{k=1}^{n}|x_k-y_k|^r})^\frac{1}{r} d(x,y)=(k=1∑n∣xk−yk∣r)r1
其中,n是x和y的维度, x k x_k xk和 y k y_k yk分别是x和y上第k个分量的值。,r是参数。注意,n与r不同,n是向量的维度,r是空间的维度。此外,细心的读者可能已经发现,当r=1时,闵可夫斯基距离距离即为曼哈顿距离;当r=2时,闵可夫斯基距离距离即为欧几里得距离。
算法优缺点
俗话说得好,人无完人,而算法本身也有各自的优缺点。至于k最近邻算法,则其优缺点如下:
- 优点
- k最近邻思想简单易懂,实现难度低,无需训练。
- 缺点
- 在分类时,k最近邻必须计算待分类样本与全体样本的距离,计算量大,需要消耗很长的时间。
- 当样本不平衡时,k最近邻的分类结果会偏向于样本数量多的类别。