开一个新专题,每次讲一个机器学习算法的知识点。
k近邻(k-Nearest Neighbor, 简称k-NN)学习是一种常用的监督学习方法。
工作机制: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的 k 个训练样本,然后基于这 k 个"邻居 “的信息来进行预测 . 既可以回答分类问题,也可以回答回归问题。通常,在分类任务中可使用 “投票法” 即选择这 k 个样本中出现最多的类别标记作为预测结果;在回归任务中时使用"平均法”,即将这 k 个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的样本权重越大.
这种学习算法没有显式的训练过程,属于"懒惰学习"(lazy learning) ,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到
测试样本后再进行处理;相应的,那些在训练阶段就对样本进行学习处理的方
法,称为"急切学习" (eager learning)。
lazy learning和eager learning的区别如下:
- 懒惰学习比急切学习在训练阶段花的时间少,但是在预测阶段花的时间较多
- 懒惰学习都是用局部的线性函数来近似,而急切学习都是全局的方法
kNN算法有三个要素,分别是:
- k值的选择
- 距离的度量
- 分类决策规则
k值的选择
如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差(bias)会减小,只有与输入实例较近的训练实例才会对预测结果起到作用。但缺点是“学习”的估计误差(variance)会增大,预测结果会对近邻的实例点非常敏感。
换句话说,k值的减小就意味着整体模型变得复杂,容易发生过拟合。
如果选择较大的k值,就相当于用较大的邻域中的训练实例进行预测,其优点是“学习”的估计误差(variance)会减小。但缺点是“学习”的近似误差(bias)会增大,这时候与输入实例较远的训练实例也会对预测起作用,使预测发生错误。
即k值的增大就意味着整体模型变得简单,完全忽略训练实例中的大量有用信息,不可取。
k=3~10,一般用交叉验证选取k值。
最近邻分类器虽简单,但它的泛化错误率不超过贝叶斯最优分类器的错误率的两倍。
注意:数据需要标准化
距离的度量
有几种距离计算方法:
- 明氏距离
L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p L_p(x_i,x_j)=(\sum_{l=1}^n |x_i^{(l)}-x_j^{(l)}|^p)^{\frac{1}{p}} Lp(xi,xj)=