Python K最近邻从原理到实现的方法


Posted in Python onAugust 15, 2019

本来这篇文章是5月份写的,今天修改了一下内容,就成今天发表的了,CSDN这是出BUG了还是什么改规则了。。。

引文:决策树和基于规则的分类器都是积极学习方法(eager learner)的例子,因为一旦训练数据可用,他们就开始学习从输入属性到类标号的映射模型。一个相反的策略是推迟对训练数据的建模,直到需要分类测试样例时再进行。采用这种策略的技术被称为消极学习法(lazy learner)。最近邻分类器就是这样的一种方法。

注:KNN既可以用于分类,也可以用于回归。

1.K最近邻分类器原理

首先给出一张图,根据这张图来理解最近邻分类器,如下:

Python K最近邻从原理到实现的方法

根据上图所示,有两类不同的样本数据,分别用蓝色的小正方形红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在, 我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。

我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他or她身边的朋友入手,所谓观其友,而识其人。我们不是要判别上图中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从上图中,你还能看到:

  • 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。其关键还在于K值的选取,所以应当谨慎。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

KNN 算法本身简单有效,它是一种 lazy-learning 算法,分类器不需要使用训练集进行训练,训练时间复杂度为0。KNN 分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为 n,那么 KNN 的分类时间复杂度为O(n)。

前面的例子中强调了选择合适的K值的重要性。如果太小,则最近邻分类器容易受到训练数据的噪声而产生的过分拟合的影响;相反,如果K太大,最近分类器可能会误会分类测试样例,因为最近邻列表中可能包含远离其近邻的数据点。(如下图所示)

Python K最近邻从原理到实现的方法 

K较大时的最近邻分类

可见,K值的选取还是非常关键。

2.算法算法描述

k近邻算法简单、直观:给定一个训练数据集(包括类别标签),对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。下面是knn的算法步骤。

算法步骤如下所示:

Python K最近邻从原理到实现的方法

对每个测试样例z=(x′,y′),算法计算它和所有训练样例(x,y)属于D之间的距离(如欧氏距离,或相似度),以确定其最近邻列表Dz。如果训练样例的数目很大,那么这种计算的开销就会很大。不过,可以使索引技术降低为测试样例找最近邻是的计算量。

特征空间中两个实例点的距离是两个实例相似程度的反映。

一旦得到最近邻列表,测试样例就可以根据最近邻的多数类进行分类,使用多数表决方法。

K值选择

k值对模型的预测有着直接的影响,如果k值过小,预测结果对邻近的实例点非常敏感。如果邻近的实例恰巧是噪声数据,预测就会出错。也就是说,k值越小就意味着整个模型就变得越复杂,越容易发生过拟合。

相反,如果k值越大,有点是可以减少模型的预测误差,缺点是学习的近似误差会增大。会使得距离实例点较远的点也起作用,致使预测发生错误。同时,k值的增大意味着模型变得越来越简单。如果k=N,那么无论输入实例是什么,都将简单的把它预测为样本中最多的一类。这显然实不可取的。

在实际建模应用中,k值一般取一个较小的数值,通常采用cross-validation的方法来选择最优的k值。

3.K最邻近算法实现(Python)

KNN.py(代码来源《机器学习实战》一书)

from numpy import *
import operator

class KNN:
  def createDataset(self):
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels

  def KnnClassify(self,testX,trainX,labels,K):
    [N,M]=trainX.shape

  #calculate the distance between testX and other training samples
    difference = tile(testX,(N,1)) - trainX # tile for array and repeat for matrix in Python, == repmat in Matlab
    difference = difference ** 2 # take pow(difference,2)
    distance = difference.sum(1) # take the sum of difference from all dimensions
    distance = distance ** 0.5
    sortdiffidx = distance.argsort()

  # find the k nearest neighbours
    vote = {} #create the dictionary
    for i in range(K):
      ith_label = labels[sortdiffidx[i]];
      vote[ith_label] = vote.get(ith_label,0)+1 #get(ith_label,0) : if dictionary 'vote' exist key 'ith_label', return vote[ith_label]; else return 0
    sortedvote = sorted(vote.iteritems(),key = lambda x:x[1], reverse = True)
    # 'key = lambda x: x[1]' can be substituted by operator.itemgetter(1)
    return sortedvote[0][0]

k = KNN() #create KNN object
group,labels = k.createDataset()
cls = k.KnnClassify([0,0],group,labels,3)
print cls

运行:
1. 在Python Shell 中可以运行KNN.py

>>>import os
>>>os.chdir("/home/liudiwei/code/data_miningKNN/")
>>>execfile("KNN.py")

输出:B
(B表示类别)

2.或者terminal中直接运行

$ python KNN.py

3.也可以不在KNN.py中写输出,而选择在Shell中获得结果,i.e.,

>>>import KNN
>>> KNN.k.KnnClassify([0,0],KNN.group,KNN.labels,3)

附件(两张自己的计算过程图):

Python K最近邻从原理到实现的方法 

1 KNN算法核心部分

Python K最近邻从原理到实现的方法 

图2 KNN计算过程

说明:上述图片仅供参考,看不懂就自己测试一组数据如[0,1]慢慢推导一下吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python函数缺省值与引用学习笔记分享
Feb 10 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python中的列表知识点汇总
Apr 14 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
详解python的ORM中Pony用法
Feb 09 Python
基于python OpenCV实现动态人脸检测
May 25 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python 等差数列末项计算方式
May 03 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 #Python
浅谈Python 敏感词过滤的实现
Aug 15 #Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 #Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 #Python
Python依赖包整体迁移方法详解
Aug 15 #Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 #Python
python 修改本地网络配置的方法
Aug 14 #Python
You might like
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
smarty的保留变量问题
2008/10/23 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
python实现换位加密算法的示例
2018/10/14 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python ubplot使用方法解析
2020/01/10 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
机械专业个人求职自荐信格式
2013/09/21 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
大学课外活动总结
2014/07/09 职场文书
庆六一活动总结
2014/08/29 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Go并发4种方法简明讲解
2022/04/06 Golang