k-NearestNeighbor,翻译为K最近邻算法,是数据挖掘算法中最简单的一种算法。
我们先用一个例子体会下。
我们很容易知道,这些电影的类型,那么当有一部新电影出现的时候, 可不可以对其进行自动分类了?
我们可以把打斗次数看成 X 轴,接吻次数看成 Y 轴,然后在二维的坐标轴上,对这几部电影进行标记,如下图所示。
对于未知的电影 A,坐标为 (x,y),我们需要看下离电影 A 最近的都有哪些电影,这些电影中的大多数属于哪个分类,那么电影 A就属于哪个分类。实际操作中,我们还需要确定一个 K 值,也就是我们要观察离电影 A 最近的电影有多少个。
KNN 的工作原理
1、计算待分类物体与其他物体之间的距离;
2、统计距离最近的 K 个邻居;
3、对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
K 值如何选择?
如果 K 值比较小,就相当于未分类物体与它的邻居非常接近才行。这样产生的一个问题就是,如果邻居点是个噪声点,那么未分类物体的分类也会产生误差,这样 KNN 分类就会产生过拟合。
如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况的好处是鲁棒性强,但是不足也很明显,会产生欠拟合情况,也就是没有把未分类物体真正分类出来。
所以 K 值应该是个实践出来的结果,并不是我们事先而定的。在工程上,我们一般采用交叉验证的方式选取 K 值。
交叉验证的思路就是,把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在 KNN 算法中,我们一般会把 K 值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为 K 值。
距离如何计算?
在 KNN 算法中,还有一个重要的计算就是关于距离的度量。两个样本点之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大;距离越小,相似度越大。
欧氏距离;
曼哈顿距离;
闵可夫斯基距离;
切比雪夫距离;
余弦距离
其中前三种距离是 KNN 中最常用的距离,我给你分别讲解下。
欧氏距离:
A(x1,x2),B(y1,y2)
同理,我们也可以求得两点在 n 维空间中的距离:
曼哈顿距离在几何空间中用的比较多。以下图为例,绿色的直线代表两点之间的欧式距离,而红色和黄色的线为两点的曼哈顿距离。所以曼哈顿距离等于两个点在坐标系上绝对轴距总和。用公式表示就是:
闵可夫斯基距离不是一个距离,而是一组距离的定义。对于 n 维空间中的两个点 x(x1,x2,…,xn) 和 y(y1,y2,…,yn) , x 和 y 两点之间的闵可夫斯基距离为:
其中 p 代表空间的维数,当 p=1 时,就是曼哈顿距离;当 p→∞时,就是切比雪夫距离。
二个点之间的切比雪夫距离就是这两个点坐标数值差的绝对值的最大值,用数学表示就是:max(|x1-y1|,|x2-y2|)。
余弦距离实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对数值不敏感。在兴趣相关性比较上,角度关系比距离的绝对值更重要,因此余弦距离可以用于衡量用户对内容兴趣的区分度。
比如我们用搜索引擎搜索某个关键词,它还会给你推荐其他的相关搜索,这些推荐的关键词就是采用余弦距离计算得出的。
KD 树
其实从上文你也能看出来,KNN 的计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升 KNN 的搜索效率,人们提出了 KD 树(K-Dimensional)。
KD 树是对数据点在 K 维空间中划分的一种数据结构。在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。
我们不需要对 KD 树的数学原理了解太多,你只需要知道它是一个二叉树的数据结构,方便存储 K 维空间的数据就可以了。而且在 sklearn 中,我们直接可以调用 KD 树,很方便。
用 KNN 做回归
KNN 不仅可以做分类,还可以做回归。如何理解什么是分类什么是回归?
同一个特征集,我们关注的目标变量决定了我们选用的是分类,亦或是回归;对于开头提到的数据集,
如果,我们要根据打斗次数,接吻次数来判断电影类型----分类问题
如果,我们知道电影类型,想知道打斗次数,接吻次数—回归问题
那么 KNN 如何做回归呢?
对于一个新点,我们需要找出这个点的 K 个最近邻居,然后将这些邻居的属性的平均值赋给该点,就可以得到该点的属性。
举个例子:
比如一部电影 A,已知它是动作片,当 K=3 时,最近的 3 部电影是《战狼》,《红海行动》和《碟中谍 6》,那么它的打斗次数和接吻次数的预估值分别为(100+95+105)/3=100 次、(5+3+31)/3=13 次。
总结
1、knn最重要的是k的选择与距离公式的选择,我们为了防止过拟合与欠拟合,采用交叉验证的思维确定k;不同的需求,选用的距离公式也不同,比如对于推荐算法,采用余弦距离最为合适。
2、knn可以用作分类,也可以用作回归
3、knn的底层之一是距离计算过程的效率,这里我们使用KD树–二叉树的数据结构,方便存储 K 维空间的数据。
4、KNN是最基本的数据挖掘方法,同时也是推荐算法的基础;如今推荐系统的算法会使用 TD-IDF、协同过滤、Apriori 算法
参看文献
《数据分析实战45讲》
想要深入理解,参考
机器学习(周志华教授)
统计学习方法(李航博士)