algo_KNN(k-nearest neighbor)

来源:互联网 发布:创度软件联系方式 编辑:程序博客网 时间:2024/06/08 07:37

1 k-NN算法

k-近邻(k-Nearest Neighbors, k-NN)算法是机器学习中非常简单的一个算法,可以用于分类和回归问题。
其基本思想是,在特征空间中接近的两个实例,其类别/函数值也接近。对实例x,找到训练样本中和其接近的实例,也就是近邻,然后根据近邻的类别/函数值预测实例x的类别/函数值。

1.1 训练

k-NN算法的训练过程非常简单,仅仅需要把训练数据存储起来。k-NN算法是一种懒惰学习(lazy learning):在训练阶段仅仅把训练数据保存起来,训练时间开销为0,所有的工作都留在测试阶段。

1.2 预测

预测过程也非常清晰。对于输入x,计算它和所有训练实例之间的相似度,找到k个近邻,然后根据k个近邻的输出得到x的输出。对于分类问题,可以取k个近邻中最常见的类别;对于回归问题,可以取k个近邻输出的均值。

1.2.1 距离度量

一般使用距离来度量相似度:距离越近越相似,越远越不相似。

为了确定输入x的近邻,需要计算x和所有训练实例之间的距离。事实上,有多种不同的距离度量可供使用。

对于实值特征向量x,yRd,常见的距离度量是Euclidean距离(欧氏距离),计算公式如下:

disteuclidean=i=1d(xiyi)2.

Manhattan距离(曼哈顿距离)也可以用于度量实值向量之间的距离,计算公式如下:

distmanhattan=i=1d|xiyi|.

欧氏距离和曼哈顿距离都是Minkowski距离(闵可夫斯基距离)的特例。

对于离散特征向量x,y,可以使用Hamming距离(海明距离)度量向量之间的距离,计算公式如下:

disthamming=|{i|xiyi,i=1,2,,d}|.

除了这里介绍的,还有很多其他距离度量:

  • Mahalanobis距离(马氏距离)
  • cosine距离(余弦距离)
  • Jaccard系数
  • Tanimoto系数

不同的距离度量对k-NN算法的结果会有不同的影响,需要根据输入数据的特点选择合适的距离度量。如果对输入数据没有任何先验知识,可以把距离度量看做超参,把训练数据划分成训练集和验证集,在验证集上尝试不同的距离度量,选择性能最好的那个。详细过程见下面关于另一个超参k的选择过程。

1.2.2 k值选择

在得到输入x和训练实例之间的距离之后,需要选择k个近邻。k值取多少合适呢?

首先通过一个分类问题直观感受一下k值对分类结果的影响。下面两张图给出了不同的k值对k-NN决策边界的影响:
这里写图片描述

白色区域表示不同类别投票数相同时的预测模糊区域。从图中可以看出,k值越大,k-NN决策边界越平滑。另外,在k值比较小时,会出现由异常点导致的分类错误的孤岛,这表明此时出现了过拟合现象,即对训练数据的噪声也进行了很好地学习。

关于k值,再补充一个结论:k值越小,偏差越小,方差越大(和过拟合现象的吻合);k值越大,偏差越大,方差越小。

那么怎么确定k值呢?有不少文章研究k的自适应选择问题,而最常见的方法还是验证法。

把总训练数据进行划分成两部分,一部分作为训练集,一部分作为验证集。对不同的k值,可以得到在验证集上的性能(如果是分类问题,可以使用准确率;如果是回归问题,可以使用误差平方和),取性能最好的那个k值作为模型超参。

如果训练数据比较少,可以采用交叉验证法。把训练数据等分成n份,每次取第i份作为验证集,得到k-NN在此验证集上的性能。这样,对某个确定的k值,可以得到n个性能值,取n个性能值的平均作为相应模型的性能估计。对不同的k值都可以得到一个性能估计,取性能最好的那个k值作为最优超参。

1.2.3 投票机制

确定了k个近邻后,需要根据k个近邻的输出确定输入x的输出。

对于分类问题,可以采用投票法,即选择k个近邻中出现次数最多的类别作为x的类别。也可以根据距离进行加权投票,距离越远的近邻权重越小,距离越近的近邻权重越大。

对于回归问题,可以用k个近邻输出的均值作为x的输出结果。类似的,也可以根据距离进行加权平均。

1.3 数据预处理

为了更充分地发挥k-NN算法的能力,有必要对数据进行预处理操作。

1.3.1 归一化

由于不同维度特征的量纲是不一样的,比如体重(kg)和身高(cm),那么在计算距离时,会导致不同维度的差异对距离的贡献不同。所以有必要对输入进行归一化操作。

可以把输入归一化到[0, 1]范围中;也可以把输入归一化到均值为0,方差为1,这种归一化称为z变换。

1.3.2 降维

k-NN算法在低维空间中的效果更好,不适用于高维空间。

首先,在论文[1]中证明了,对于最近邻算法(即k=1),当训练样本采样密度足够大时,其整体风险小于贝叶斯风险的两倍。而输入空间会随着空间维数的增减而呈指数级增长,此时训练样本很难满足密集采样的条件。

其次,高维空间中的向量之间的距离是反直觉的,即我们认为相似的物体在高维空间中距离可能非常远,这和我们常见的二维三维空间不同。

在高维空间中出现的样本稀疏问题以及距离反直觉问题被称为维数灾难。

对高维数据,可以降维之后再应用k-NN算法。至于降维技术,可以选择特征提取,PCA等方法。

2 k-NN算法的计算复杂度

k-NN的训练过程不需要花费时间,但测试阶段要花费大量时间进行计算。可以通过牺牲准确率来降低测试阶段的计算时间。常见的方法是构造kd树。

参考

[1] Nearest Neighbor Pattern Classification. 1967.
[2] K-Nearest Neighbors for Machine Learning
[3] cs231n note
[4] K-Nearest Neighbors – the Laziest Machine Learning Technique

原创粉丝点击