k近邻算法
介绍
k近邻算法是一种思想简单,应用数学知识比较少的算法,可以解释机器学习算法使用过程中的很多细节问题,能够刻画机器学习应用的流程,效果也不是很差,我们先从这个算法开始。
首先,看一个图,我们很明显的看到,数据被分为两类。
如果这时候来了一个新的点,我们可以很直观地知道,它属于红色那一类
因为它“看起来”离红色的点最近。k近邻算法就是用确切的数据,定量地算出它确实很“近”。
k是指,选取k个离它最近的点。算法的具体流程如下:
- 1 计算测试数据与各个训练数据之间的距离;
- 2 按照距离的递增关系进行排序;
- 3 选取距离最小的K个点;
- 4 确定前K个点所在类别的出现频率;
- 5 返回前K个点中出现频率最高的类别作为测试数据的预测分类。
下图中给出了KNN算法中K值选区的规则:
图中的数据集是良好的数据,即都有对应的标签。一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是待分类的数据。 - K= 3 时,范围内红色三角形多,这个待分类点属于红色三角形。
- K= 5 时,范围内蓝色正方形多,这个待分类点属于蓝色正方形。
如何选择一个最佳的K值取决于数据。一般情况下,在分类时较大的 K 值能够减小噪声的影响,但会使类别之间的界限变得模糊。因此 K 的取值一般比较小 ( K < 20 )。
距离怎么算
欧拉距离
上面提到了要计算数据之间的距离,在二维平面上,计算距离最常用的方式就是欧拉距离:
(
x
(
a
)
−
x
(
b
)
)
2
+
(
y
(
a
)
−
y
(
b
)
)
2
\sqrt{(x^{(a)}-x^{(b)})^2+(y^{(a)}-y^{(b)})^2}
(x(a)−x(b))2+(y(a)−y(b))2
从二维平面推广到多维(维度在k近邻算法里面其实就是特征):
最终简写成如下形式:
曼哈顿距离
在表达距离数学上还有另外一种方式,就是曼哈顿距离:
图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。
下面推导欧拉距离和曼哈顿距离的一致性:
欧拉距离:
=>
=>
曼哈顿距离:
=>
对比:
由此我们可以得出一个新的超参数p(下面会讲超参数),通过改变p可以改变距离的计算方法
p取1或2时的明氏距离是最为常用的,p=2即为欧氏距离,而p=1时则为曼哈顿距离。
更进一步,我们可以得到一个新的距离计算方法,明可夫斯基距离。
明科夫斯基距离
更多距离的定义
kNN算法的特点
机器学习算法过程是一个首先产生训练模型,然后输入测试数据输出预测数据的过程。但是kNN算法是一个不需要训练数据产生训练模型的算法,被认为是没有模型的算法,为了和其他算法统一,可以认为训练数据集就是模型本身。
超参数和模型参数
超参数:在算法运行前需要决定的参数。之前说的要确定是p是2还是1,也就是使用欧拉距离还是曼哈顿距离,在算法运行前就要决定。
模型参数:算法过程中学习的参数。
kNN算法中没有模型参数,kNN算法中的k是典型的超参数。
寻找合适的超参数,需要领域的知识、经验数值和实验去搜索。
数值归一化
由于kNN算法计算距离,对距离很敏感,如果距离相差太大或者太小,都会对预测的结果产生影响,所以需要把数据映射到同一尺度上。
下面介绍两种数据归一化方法:最值归一化 (Normallization)和均值方差归一化(Standardization)
什么是数据归一化方法,来一个百度百科艰苦的解释:归一化方法有两种形式,一种是把数变为(0,1)之间的小数,一种是把有量纲表达式变为无量纲表达式。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。
简单的来说,就是把所有的数据映射到同一个尺度
最值归一化 (Normallization)
把所有的数据映射到0-1之间,公式:
X
m
a
x
=
X
−
X
m
i
n
X
m
a
x
−
X
m
i
n
X_{max}=\frac{X-X_{min} }{ X_{max}-X_{min}}
Xmax=Xmax−XminX−Xmin
对于怎么理解这个公式,把
X
m
i
n
X_{min}
Xmin变为0,理解起来就很容易,所有的数都不超过1。
首先看一个向量的归一化
然后看矩阵的:
最后看他们的一些统计情况:
适用于分布有明显边界的情况:受边界影响比较大。如果存在极端数据,那这种方式不合适,就要用下面的方式。
均值方差归一化(Standardization)
把所有数据归一到均值为0方差为1的分布中
X
s
c
a
l
e
=
X
−
X
m
e
a
n
S
X_{scale}=\frac{X-X_{mean}}{S}
Xscale=SX−Xmean
适用于数据分布没有明显边界;有可能存在极端数据的情况。
其他关于kNN算法
优点
- 用于解决分类问题
- 天然可以解决多分类问题
- 思想简单,效果强大
其实kNN算法也可以用于解决回归问题,有兴趣查阅资料去了解。
缺点
- 最大缺点:效率低下:如果训练集有m个样本,n个特征,那么预测每一个新的数据集,需要O(m*n)的时间;可以通过如下方式优化,例如使用树结构:KD-Tree,Ball-Tree
- 缺点二:高度数据相关
- 缺点三:预测的结构不具有可解释性
- 缺点四:维数灾难,随着维度的增加,“看似相近”的两个点之间的距离越来越大。如下图:
维度 | 计算 | 距离 |
---|---|---|
1维 | 0到1的距离 | 1 |
2维 | (0,0)到(1,1)的距离 | 1.414 |
3维 | (0,0,0)到(1,1,1)的距离 | 1.73 |
64维 | (0,0,…0)到(1,1,…1)的距离 | 8 |
10000维 | (0,0,…0)到(1,1,…1)的距离 | 100 |
可以通过降维的方式解决。