K-近邻算法

1.1K近邻(k-Nearest Neighbor,KNN)算法 的概述 1.2 

K近邻(k-NearestNeighborKNN)算法,是一个理论上比较成熟的方法简单地说,K近邻(k-NearestNeighborKNN)算法采用测量不同特征值之间的距离方法进行分类。

1.2 工作原理:

k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

举个例子:我们可以使用k-近邻算法分类一个电影是爱情片还是动作片。

K-近邻算法_第1张图片
散点图如下:黄色的点是未知电影分类, 绿色的点代表动作片, 紫色的点代表爱情片, 直观观察可以看出黄色的点应该属于动作片, 因为黄色的点更靠近动作片分类

K-近邻算法_第2张图片

k-近邻算法用距离度量。这个电影分类的例子有2个特征,也就是在2维实数向量空间,可以使用我们高中学过的两点距离公式计算距离,如图所示。

机器学习实战教程(一):K-近邻算法(史诗级干货长文)


通过计算可知:

K-近邻算法_第3张图片

通过计算可知,黄色圆点标记的电影到动作片 (99,5)的距离最近,为11.66。如果算法直接根据这个结果,判断该黄色圆点为动作片。以上就是最近邻算法的过程, K-近邻算法在以上步骤基础上选出K个最近的样本点,计算K个样本点所属类别的频率, 频率最高的类别就是当前预测分类。

上面的例子, 如果我们设置K=2 , 那么要选出最近的两个样本点(99,5) 和(101,10), 两个样本点都属于动作篇那么动作片的频率为100%。所以预测分类为动作片。


1.3 K-近邻算法的一般流程:

  1. 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
  2. 准备数据:使用Python解析、预处理数据。
  3. 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
  4. 测试算法:计算错误率。
  5. 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

1.4 示例:

海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人。经过一番总结,她发现自己交往过的人可以进行如下分类:

  1. 不喜欢的人
  2. 魅力一般的人
  3. 极具魅力的人

海伦收集约会数据已经有了一段时间,样本数据主要包含以下3种特征 如图所示:

  1. 每年获得的飞行常客里程数
  2. 玩视频游戏所消耗时间百分比
  3. 每周消费的冰淇淋公升数

原始数据如下图所示:


1.4.1 读取数据:

python 代码如下:

K-近邻算法_第4张图片


1.4.2 绘制散点图:

python 代码如下:

K-近邻算法_第5张图片


1.4.3归一化数据:

如果属性之间数量级差距较大, 那么数量极大的属性对结果影响较大。 此例中飞行里程数远远大于其他两个属性的值, 那么飞行里程对计算结果的影响将要远远大于其他两个特征。但是我们认为这三个属性对结果影响是同等重要的, 所以我们要对特征值进行数值归一化, 将特征的取值范围处理到 [0,1]或者[-1,+1]之间。公式如下:

newvalue=(oldvalue-min)/(max-min)

python 代码如下:

K-近邻算法_第6张图片

1.4.4建立分类器及测试算法:

通常我们只提供已有数据的90% 作为训练数集, 保留10%数据对已有的分类器进行测试。错误率可以用来检测分类器的性能。如下结果我们keep 20%的数据用于测试。错误率8%。

K-近邻算法_第7张图片


1.5 总结

kNN算法的优缺点

优点

  • 简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
  • 可用于数值型数据和离散型数据;
  • 训练时间复杂度为O(n);无数据输入假定;
  • 对异常值不敏感

缺点

  • 计算复杂性高;空间复杂性高;
  • 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
  • 一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。
  • 最大的缺点是无法给出数据的内在含义。

参考资料:

本文的理论部分,参考自《机器学习实战》的第二章k-近邻算法。

http://cuijiahua.com/blog/2017/11/ml_1_knn.html

点击打开链接

文章有些代码图片借鉴与其他文章, 希望原创作者不要介意。




你可能感兴趣的:(K-近邻算法)