Bootstrap

机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

k近邻算法(kNN)

        本博客来源于CSDN:http://blog.csdn.net/niuwei22007/article/details/49703719

              本博客源代码下载地址:CSDN免费下载GitHub下载地址 均带有详细注释和测试数据

        今天学习了《机器学习实战》这本书介绍的第一个机器学习算法—k近邻算法。书中介绍它对于分类非常有效,比如书中的例子是对电影的题材进行分类。

一、算法原理

        算法原理是什么?允许我不严谨的说一下:首先有一堆有标签的样本,比如有一堆各种各样的鸟(样本集),我知道各种鸟的不同外貌(特征),比如羽毛颜色有无脚蹼身体重量身体长度以及最重要的它属于哪一种鸟类别/标签);然后给我一只不是这堆鸟中的一只鸟(测试样本),让我观察了它的羽毛颜色等后,让我说出它属于哪一种鸟?我的做法是:遍历之前的一堆鸟,分别比较每一只鸟的羽毛颜色、身体重量等特征与给定鸟的相应特征,并给出这两只鸟的相似度。最终,从那一堆鸟中找出相似度最大的前k,然后统计这k只鸟的分类,最后把分类数量最多的那只鸟的类别作为给定的类别。虽然结果不一定准确,但是是有理论支持的,那就是概率论,哈哈。

        下面来看一下书上对这个算法的原理介绍:存在一个训练样本集,并且每个样本都存在标签(有监督学习)。输入没有标签的新样本数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出与样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,而且k通常不大于20。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

二、如何解决问题

        没接触过的同学应该能懂了吧。书中的举例是对电影的题材进行分类:爱情片or动作片。依据电影中打斗镜头和接吻镜头的数量。下面来看一下如何用kNN来解决这个问题。

        

        要解给定一部电影,判断其属于哪一种电影这个问题,就需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图所示,问号位置所代表的两种镜头次数分别是多少?

        下面我们来看一下图中电影的特征值,如下表:


        相信看过数据以后,即使不知道未知电影(?)属于哪一种类型,但是可以通过某个计算方法计算出来。

  • 第一步:首先计算未知电影与已知电影的相似度(抽象距离--相似度越小,距离越远)。
;