1.概述
KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。
KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。
KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。
一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。
简单来讲,KNN就是“近朱者赤,近墨者黑”的一种分类算法。
2.优缺点
KNN算法优点
简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
预测效果好。
对异常值不敏感
KNN算法缺点
对内存要求较高,因为该算法存储了所有训练数据
预测阶段可能很慢
对不相关的功能和数据规模敏感
适用场景
多分类问题
稀有事件分类问题
文本分类问题
模式识别
聚类分析
样本数量较少的分类问题
基本流程描述
- 计算当前点与所有点之间的距离
- 距离按照升序排列
- 选取距离最近的K个点
- 统计这K个点所在类别出现的频率
- 这K个点中出现频率最高的类别作为预测的分类
3.代码实现
假设有下面一些电影,不同的电影有不同的镜头比例,我们用KNN来进行分类。
电影名 | 搞笑镜头 | 拥抱镜头 | 打斗镜头 | 分类 |
宝贝当家 | 45 | 2 | 10 | 喜剧片 |
功夫熊猫 | 40 | 5 | 35 | 喜剧片 |
举起手来 | 50 | 2 | 20 | 喜剧片 |
碟中谍2 | 5 | 2 | 60 | 动作片 |
叶问 | 4 | 3 | 65 | 动作片 |
空中营救 | 1 | 2 | 63 | 动作片 |
怦然心动 | 5 | 39 | 1 | 爱情片 |
时空恋旅人 | 6 | 35 | 1 | 爱情片 |
恋恋笔记本 | 10 | 40 | 1 | 爱情片 |
加勒比海盗1": [15, 3, 60, “?片”],现在用KNN进行预测。
代码实现:
运行结果:
当KNN = KNN[0:3]
KNN = KNN[0:3]
4.总结
最后统计分类出现频数的时候,喜剧片和动作片同样是3次,这就说明k选大了,较远的点也参与的预测。
如果k值比较小,相当于我们在较小的领域内训练样本对实例进行预测。这时,算法的近似误差会比较小,因为只有与输入实例相近的训练样本才会对预测结果起作用。
但是,它也有明显的缺点:算法的估计误差比较大,预测结果会对近邻点十分敏感,也就是说,如果近邻点是噪声点的话,预测就会出错。因此,k值过小容易导致KNN算法的过拟合。
同理,如果k值选择较大的话,距离较远的训练样本也能够对实例预测结果产生影响。这时候,模型相对比较鲁棒,不会因为个别噪声点对最终预测结果产生影响。但是缺点也十分明显:算法的近邻误差会偏大,距离较远的点(与预测实例不相似)也会同样对预测结果产生影响,使得预测结果产生较大偏差,此时模型容易发生欠拟合。