KNN
KNN:K-Nearest Neighbor
数据挖掘算法中最简单的一种
工作原理
示例:我们根据电影的打斗次数、接吻次数等指标来统计电影的类型。
分类:我们将打斗次数作为X轴,接吻次数作为Y轴,放在二维坐标轴上标记,对未知的电影分类我们看它在坐标轴的位置附近的电影类型。
- 计算待分类物体与其他物体之间的距离;
- 统计距离最近的K个邻居;
- 对于K个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
KNN可以应用到 线性 和 非线性 问题中,也可以用于回归分析。
K值的选择
K值的选择对于分类十分重要。
欠拟合: 与训练集误差较大,原因的特征维度过少,导致拟合的函数无法满足训练集,误差较大。
**过拟合: **与训练集误差较小,原因的特征维度过多,导致拟合的函数完美的经过训练集,对新测结果交叉。
鲁棒性: 也称为是强壮性、或者稳健性。
- K值过小:相当于未分类的物体与它的邻居非常接近才行,产生一个问题如果邻居是个噪声点,那么未分类物体的分类会产生误差,那么KNN分类就会产生过拟合。
- K值过大:相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况 的好处是 鲁棒性 强,但是不足也很明显,会产生 欠拟合 情况,也就是没有把未分类的物体真正分类出来。
距离的计算
两个样本之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大;距离越小,差异性越大。
距离计算的方式有以下五种:
- 欧氏距离;
- 曼哈顿距离;
- 闵可夫斯基距离;
- 切比雪夫距离;
- 余弦距离。
前三种距离是KNN
常用的距离。
欧氏距离
最常用的距离公式,也叫做欧几里得距离,在二维空间中,两点的欧氏距离就是。
d = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 d = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2} d=(x1−y1)2+(x2−y2)2
n维空间中的距离: d = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + … + ( x n − y n ) 2 = ∑ k = 1 n ( x i − y i ) 2 d = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + … + (x_n - y_n)^2} = \sqrt{\sum\limits_{k=1}^n(x_i-y_i)^2} d=(x1−y1)2+(x2−y2)2+…+(xn−yn)2=k=1∑n(xi−yi)2
曼哈顿距离
在几何空间用的较多,等于在两个点在坐标轴上绝对轴距综合。
d = ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ d = |x_1 - y_1| + |x_2 - y_2| d=∣x1−y1∣+∣x2−y2∣
闵可夫斯基距离
不是一个距离,而是一组距离的定义。对于n维空间的两个点
x(x1,x2,..,xn)
,x和y两点之间的距离。
d = p ∑ i = 1 n ∣ x i − y i ∣ p d = p\sqrt{\sum\limits_{i=1}^n|x_i - y_i|^p} d=pi=1∑n∣xi−yi∣p
其中p
代表空间的维数,当p=1
时,就是曼哈顿距离;当p=2
时,就是欧氏距离;当p=∞
时,就是切比雪夫距离。
切比雪夫距离
两个点之间的切比雪夫距离就是两个点坐标数值的绝对值得最大值。
m a x ( ∣ x 1 − y 1 ∣ , ∣ x 2 − y 2 ∣ ) max(|x_1 - y_1|, |x_2 - y_2|) max(∣x1−y1∣,∣x2−y2∣)
余弦距离
实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对值不敏感。
在兴趣相关性上,角度关系比距离关系的绝对值更重要,因此余弦距离可以用于衡量用户对内容兴趣的区分度。
**搜索关键词推荐:**比如我们用搜索引擎搜索某个关键词,它还会给你推荐其他的相关搜多,这些推荐搜索的关键词就是采用余弦距离计算得到的。
KD树
是一个二叉树的数据结构,方便存储K维空间的数据。
KNN
的计算过程是大量计算样本点之间的距离,为了减少计算距离次数,提升KNN
的搜索效率,提出KD树。
KD树: 对数据点在K
维空间中划分的一种数据结构。在KD树构造中,每个节点都是K维数值点的二叉树。可以采用二叉树的增删查改操作,提升了搜索效率。
用KNN做回归
KNN不仅可以做分类,还可以做回归。
分类: 对未知电影根据打斗次数来进行类型划分。
回归: 根据打斗次数来获取电影属于那种类型。
对于一个新的点,我们找到改点K个最相近的点,然后将这些点的属性平均值赋值给改点,就得到了改点的属性。