k近邻算法(kNN)
本博客来源于CSDN:http://blog.csdn.net/niuwei22007/article/details/49703719
本博客源代码下载地址:CSDN免费下载、GitHub下载地址 均带有详细注释和测试数据
今天学习了《机器学习实战》这本书介绍的第一个机器学习算法—k近邻算法。书中介绍它对于分类非常有效,比如书中的例子是对电影的题材进行分类。
一、算法原理
算法原理是什么?允许我不严谨的说一下:首先有一堆有标签的样本,比如有一堆各种各样的鸟(样本集),我知道各种鸟的不同外貌(特征),比如羽毛颜色、有无脚蹼、身体重量、身体长度以及最重要的它属于哪一种鸟(类别/标签);然后给我一只不是这堆鸟中的一只鸟(测试样本),让我观察了它的羽毛颜色等后,让我说出它属于哪一种鸟?我的做法是:遍历之前的一堆鸟,分别比较每一只鸟的羽毛颜色、身体重量等特征与给定鸟的相应特征,并给出这两只鸟的相似度。最终,从那一堆鸟中找出相似度最大的前k只,然后统计这k只鸟的分类,最后把分类数量最多的那只鸟的类别作为给定鸟的类别。虽然结果不一定准确,但是是有理论支持的,那就是概率论,哈哈。
下面来看一下书上对这个算法的原理介绍:存在一个训练样本集,并且每个样本都存在标签(有监督学习)。输入没有标签的新样本数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出与样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,而且k通常不大于20。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
二、如何解决问题
没接触过的同学应该能懂了吧。书中的举例是对电影的题材进行分类:爱情片or动作片。依据电影中打斗镜头和接吻镜头的数量。下面来看一下如何用kNN来解决这个问题。
要解决给定一部电影,判断其属于哪一种电影这个问题,就需要知道这个未知电影存在多少个打斗镜头和接吻镜头,如上图所示,问号位置所代表的两种镜头次数分别是多少?
下面我们来看一下图中电影的特征值,如下表:
相信看过数据以后,即使不知道未知电影(?)属于哪一种类型,但是可以通过某个计算方法计算出来。
- 第一步:首先计算未知电影与已知电影的相似度(抽象距离--相似度越小,距离越远)。