概述
KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。
KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。
KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。
一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。
算法流程
- 计算测试时数据与各个训练数据之间的距离
- 按照距离的递增关系进行排序
- 选取距离最小的k个点
- 确定前k个点所在类别的出现频率
- 返回前k个点中出现频率最高的类别作为测试数据的预测分类
通过上述流程,我们发现KNN算法能够运行
必须首先确定两个因素:算法超参数k值和模型向量空间的距离量度
K值的确定
k值较小,相当于在较小领域内训练样本对实例预测。优点是算法的近似误差比较小。缺点是算法的估计误差比较大。预测结果会对近邻点十分敏感。如果近邻点是噪声点的话,预测就会出错。k值国小容易导致过拟合。
k值较大,距离较远的训练样本也能够对实例预测结果产生影响。这时候,模型相对比较鲁棒,不会因为个别噪声点对最终预测结果产生影响。但是缺点也十分明显:算法的近邻误差会偏大,距离较远的点也会同样对预测结果产生影响,是预测结果产生较大偏差,模型容易欠拟合。
在实际工程实践中,一般采用交叉验证的方式选取k值。
距离量度
闵可夫斯基距离
对于n维空间中的两个点
x
(
x
1
,
x
2
,
…
,
x
n
)
x(x_1,x_2,…,x_n)
x(x1,x2,…,xn)和
y
(
y
1
,
y
2
,
…
,
y
n
)
y(y_1,y_2,…,y_n)
y(y1,y2,…,yn),x和y之间的闵可夫斯基距离可以表示为:
d
x
y
=
∑
k
=
1
n
(
x
k
−
y
k
)
p
p
d_{xy} = \sqrt[p]{\sum_{k=1}^{n}(x_k-y_k)^p}
dxy=pk=1∑n(xk−yk)p
p是一个可变参数,p=1,称为曼哈顿距离;p=2时,被称为欧氏距离,p=
∞
\infty
∞时,被称为切比雪夫距离
余弦距离
1
−
c
o
s
(
θ
)
=
1
−
A
⋅
B
∣
∣
A
∣
∣
∣
∣
B
∣
∣
=
1
−
∑
i
=
1
n
A
i
B
i
∑
i
=
1
n
A
i
2
∑
i
=
1
n
B
i
2
1 - cos(\theta) = 1 - \frac{A \cdot B}{||A||||B||} = 1 - \frac{\sum_{i=1}^{n}A_iB_i}{\sqrt{\sum_{i=1}^{n}A_i^2}\sqrt{\sum_{i=1}^{n}B_i^2}}
1−cos(θ)=1−∣∣A∣∣∣∣B∣∣A⋅B=1−∑i=1nAi2∑i=1nBi2∑i=1nAiBi
KNN算法的核心:KDTree
在给定的距离量度下,如果快速找到预测实例的最近的k个邻居?直接暴力寻找,当特征空间维度特别高或者样本容量较大时,计算过程就会非常耗时
为了快速找到k个邻居,我们可以考虑使用特殊的数据结构存储训练数据,用来减少搜索次数。
KDTree是一种二叉树,表示对k维空间的一种划分构造KDTree相当于不断地利用垂直于坐标轴的超平面将k维空间进行切分,构成一系列的k维超矩形区域。KDTree的每个节点对应于一个k维超矩形区域。利用KDTree可以省去对大部分数据点的搜索,从而减少搜索的计算量。
- 构造根节点:首先,在包含所有节点的超矩形区域内选择一个坐标轴和在此坐标轴上的一个切分点,确定一个垂直于该坐标轴的超平面,这个超平面将当前区域划分为两个子区域(即二叉树的左右两个子节点)。
- 递归构造子节点,通过递归方法对两个子区域进行相同的划分,知道子区域内没有实例时终止(此时只有子节点)。
通常我们循环地选择坐标轴对空间进行划分,当选定一个维度坐标时,我们选择所有训练实例在该坐标轴上的中位数作为切分点。此时,我们构造的KDTree是平衡二叉树,但是平衡二叉树在搜索近邻时并不一定是最高效的。
KNN回归算法
与分类预测类似,KNN算法用于回归预测时,同样是寻找新来的预测实例的k近邻,然后对这k个样本的目标值去均值即可作为新样本的预测值:
优缺点
优点
精度高、对异常值不敏感、无数据输入假定
缺点
计算复杂度高、空间复杂度高
使用数据范围
数值型和标称型
参考
https://blog.youkuaiyun.com/hajk2017/article/details/82862788