前言
k-近邻(kNN,k-NearestNeighbor)是最简单有效的一种用于分类与回归的算法之一。所谓k最近邻,就是k个最近的邻居的意思,即每个样本都可以用它最接近的k个邻居来代表。
k值选择、距离度量、决策规则是k近邻算法的三个基本要素。
k-近邻做回归和分类的主要区别在于最后做预测时候的决策方式不同。当做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的k个样本,预测为里面有最多类别数的类别。而做回归时,一般是选择平均法,即最近的k个样本的样本输出的平均值作为回归预测值。
对于原始kNN计算量大的缺点,主要有KD树与球树两种改进算法。
参考:周志华-《机器学习》&Peter Harrington-《机器学习实战》
Mohamad Dolatshah, Ali Hadian, Behrouz Minaei-Bidgoli, “Ball-tree: Efficient spatial indexing for constrained nearest-neighbor search in metric spaces”, ArXiv e-prints, Nov 2015.
k值选择
k值越小,偏差越小、方差越大,容易过拟合,不抗噪声。
k值越大,偏差越大、方差越小,容易欠拟合。
通常采用经验值或交叉验证选取合适的k值。
计算距离
欧式距离:
曼哈顿距离:
闵可夫斯基距离:
当$p=1$时,就是曼哈顿距离;当$p=2$时,就是欧氏距离。
原始kNN(Brute Force)
原始的kNN算法在找近邻时采取的是Brute Force算法,暴力对所有训练集样本进行搜索,有两个明显的缺点:
1.需要存储全部训练集
2.计算量太大
一种有效的改进方法是事先将训练集按近邻关系分解成组,算出每组质心的位置,以质心作为代表点,和未知样本计算距离,选出距离最近的一个或若干个组,再在组的范围内应用原始的kNN算法。由于并不是将未知样本与所有样本计算距离,故该改进算法可以减少计算量,但并不能减少存储量。
实现k-近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,为了减少计算量,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数,比如引入树结构。