算法原理
KNN可以说是最好理解的分类算法了(当然也可以应用于回归问题),并且KNN没有显式的学习过程,被称为是一种“懒惰学习方法”。它的基本思想是将想要进行分类的测试实例丢入训练实例的特征空间,然后找到离测试实例最近的K个训练实例,通过“投票”,返回K个样本中出现次数最多的标签。
如何刻画“近”
机器学习领域有很多用来刻画两个向量距离的指标,这里我们介绍四个最常用的。
欧几里得距离:
余弦距离:
曼哈顿距离:
切比雪夫距离:
更多的相似性度量可以查看:常用的相似性度量
K值的选择
K是模型的唯一参数,这个数值我们会采用交叉验证的方式来确定,一般不会取的太大,比如sklearn中就默认为5.
如果K太小,相当于用较小的邻域中的训练实例进行预测,近似误差(approximation error)会减小,但是估计误差(estimation error)会增大。即K值的减小意味着整体模型变得复杂,容易发生过拟合。
如果K值太大,相当于用较大的邻域中的训练实例进行预测。近似误差会增大,估计误差会减小。即K值增大意味着整体模型变得简单,容易发生欠拟合。考虑一种极端情况:K=m(m为训练实例的个数),无论输入实例是什么,模型都会简单地预测它属于训练实例总出现次数最多的那个类别,这是严重的欠拟合现象。
优缺点
优点
- 简单好用,精度高
- 无输入数据假定
- 对异常值不敏感
缺点
- 计算复杂度高,空间复杂度高
- 样本不平衡问题
- 不能给出数据的内在含义
KNN之于回归
KNN也可以应用于回归问题。一般地,我们取找到的K个训练实例标签的平均值最为输入实例的回归预测值。
另外,我们还可以考虑加权平均,比如说给离输入实例越近的训练实例更高的权重。
Python代码实现
https://github.com/Haifei-ZHANG/machine-learning-algorithms/tree/master/KNN