一、什么是K-近邻算法?
K近邻算法(K-Nearest Neighbors,简称KNN)是一种基本的分类和回归算法。它的基本原理是通过测量样本之间的距离来对未知样本进行分类或预测。KNN算法被归类为一种“懒惰学习”(lazy learning)算法,因为它没有显式地从训练数据中学习模型,而是在需要进行分类或预测时才对训练数据进行计算。
二、K-近邻算法的工作流程
- 准备训练数据集,包括输入特征和对应的标签 ;
- 选择一个合适的距离度量方法,如欧氏距离或曼哈顿距离;
- 欧式距离:
其中, n表示样本向量的维度,xi和yi分别表示向量x和向量y在第i维上的取值。 - 曼哈顿距离:
其中,n表示样本向量的维度,xi和yi分别表示向量x和向量y在第i维上的取值。
- 欧式距离:
- 对于一个未知样本,计算它与训练集中每个样本的距离 ;
- 根据选定的K值,选择距离最近的K个样本 ;
- 根据这K个样本的标签,通过多数投票的方式确定未知样本的类别(对于分类问题)或计算平均值(对于回归问题) 。
三、“连续属性”和“离散属性”的距离计算
我们常将属性划分为“连续属性”和“离散属性”,前者在定义域上有无穷多个可能的取值,后者在定义域上是有限个取值。
- 若属性值之间存在有序关系,则可以将其转化为连续值,例如:身高属性“高”、“中”、“矮”,可转化为{1、0.5、0}。
- 闵可夫斯基距离可以用于有序属性。
- 若属性值之间不存在序关系,则通常将其转化为向量的形式,例如:性别属性“男”、“女”,可转化为{(1,0) , (0,1)}
四、K值怎么选择?
- 举例说明
- K值过小:
- 容易受到异常点的影响:假如K值取1,但是距离最小的那个数据是异常数据,那么预测就会发生错误。
- 选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,但“学习”估计误差会增大。换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合。
- K值过大:
- 受到样本均衡的问题:假如K值取6,则距离最小的6个值,有三个属于喜剧片,有三个属于动作片。此时,预测就会发生错误。
- 选择较大的K值,就相当于用较大领域中的训练实例进行预测,优点是可以减少“学习”估计误差,但会增大“学习”近似误差。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值得增大就意味着整体的模型变得简单。
- 近似误差:
- 对现有训练集的训练误差,关注训练集
- 如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测
- 模型本身不是最接近最佳模型
- 估计误差:
- 可以理解为对测试集的测试误差,关注测试集
- 估计误差小说明对未知数据的预测能力好
- 模型本身最接近最佳模型
在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和测试集)来选择最优的K值。
五、K-近邻算法总结
1. 优点
- 简单有效
- 重新训练的代价低
- 适合类域交叉样本
- KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的代分样本集来说,KNN方法较其他方法更为适合。
- 适合大样本自动分类
- 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
2. 缺点
- 惰性学习
- KNN算法是惰性学习方法,一些积极学习的算法要快很多
- 类别评分不是规格化
- 不像一些通过概率评分的分类
- 输出可解释性不强
- 例如决策树的输出可解释性就较强
- 对不均衡的样本不擅长
- 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
- 计算量较大
- 目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。