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爬虫之爬虫的定义及URL构成
Nov 04 Python
Python语言描述随机梯度下降法
Jan 04 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
详解python配置虚拟环境
Apr 08 Python
python远程邮件控制电脑升级版
May 23 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
pytorch查看网络参数显存占用量等操作
May 12 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
海贼王:最美的悬赏令!
2020/03/02 日漫
2019十大人气国漫
2020/03/13 国漫
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
php把数组值转换成键的方法
2015/07/13 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
详解python的数字类型变量与其方法
2016/11/20 Python
python 以16进制打印输出的方法
2018/07/09 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
python实现PID算法及测试的例子
2019/08/08 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
财务部总监岗位职责
2014/03/12 职场文书
中专生自荐信
2014/06/25 职场文书
旷课检讨书范文
2015/01/27 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
消防演习感想
2015/08/10 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang