Python语言实现机器学习的K-近邻算法


Posted in Python onJune 11, 2015

写在前面

额、、、最近开始学习机器学习嘛,网上找到一本关于机器学习的书籍,名字叫做《机器学习实战》。很巧的是,这本书里的算法是用Python语言实现的,刚好之前我学过一些Python基础知识,所以这本书对于我来说,无疑是雪中送炭啊。接下来,我还是给大家讲讲实际的东西吧。

什么是K-近邻算法?

简单的说,K-近邻算法就是采用测量不同特征值之间的距离方法来进行分类。它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据之后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出样本集中特征最相似数据的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是K-近邻算法名称的由来。

提问:亲,你造K-近邻算法是属于监督学习还是无监督学习呢?

使用Python导入数据

从K-近邻算法的工作原理中我们可以看出,要想实施这个算法来进行数据分类,我们手头上得需要样本数据,没有样本数据怎么建立分类函数呢。所以,我们第一步就是导入样本数据集合。

建立名为kNN.py的模块,写入代码:

from numpy import *
 import operator
 
 def createDataSet():
   group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
   labels = ['A','A','B','B']
   return group, labels

代码中,我们需要导入Python的两个模块:科学计算包NumPy和运算符模块。NumPy函数库是Python开发环境的一个独立模块,大多数Python版本里没有默认安装NumPy函数库,因此这里我们需要单独安装这个模块。

下载地址:http://sourceforge.net/projects/numpy/files/

Python语言实现机器学习的K-近邻算法

有很多的版本,这里我选择的是numpy-1.7.0-win32-superpack-python2.7.exe。

实现K-近邻算法

K-近邻算法的具体思想如下:

(1)计算已知类别数据集中的点与当前点之间的距离

(2)按照距离递增次序排序

(3)选取与当前点距离最小的k个点

(4)确定前k个点所在类别的出现频率

(5)返回前k个点中出现频率最高的类别作为当前点的预测分类

Python语言实现K-近邻算法的代码如下:

# coding : utf-8
 from numpy import *
 import operator 
 import kNN
 group, labels = kNN.createDataSet()
 def classify(inX, dataSet, labels, k):
   dataSetSize = dataSet.shape[0] 
   diffMat = tile(inX, (dataSetSize,1)) - dataSet
   sqDiffMat = diffMat**2
   sqDistances = sqDiffMat.sum(axis=1)
   distances = sqDistances**0.5
   sortedDistances = distances.argsort()
   classCount = {}
   for i in range(k):
     numOflabel = labels[sortedDistances[i]]
     classCount[numOflabel] = classCount.get(numOflabel,0) + 1
   sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)
   return sortedClassCount[0][0]
 my = classify([0,0], group, labels, 3)
 print my

运算结果如下:

Python语言实现机器学习的K-近邻算法

 输出结果是B:说明我们新的数据([0,0])是属于B类。

代码详解

相信有很多朋友们对上面这个代码有很多不理解的地方,接下来,我重点讲解几个此函数的关键点,以方便读者们和我自己回顾一下这个算法代码。

classify函数的参数:

inX:用于分类的输入向量
dataSet:训练样本集合
labels:标签向量
k:K-近邻算法中的k
shape:是array的属性,描述一个多维数组的维度

tile(inX, (dataSetSize,1)):把inX二维数组化,dataSetSize表示生成数组后的行数,1表示列的倍数。整个这一行代码表示前一个二维数组矩阵的每一个元素减去后一个数组对应的元素值,这样就实现了矩阵之间的减法,简单方便得不让你佩服不行!

axis=1:参数等于1的时候,表示矩阵中行之间的数的求和,等于0的时候表示列之间数的求和。

argsort():对一个数组进行非降序排序

classCount.get(numOflabel,0) + 1:这一行代码不得不说的确很精美啊。get():该方法是访问字典项的方法,即访问下标键为numOflabel的项,如果没有这一项,那么初始值为0。然后把这一项的值加1。所以Python中实现这样的操作就只需要一行代码,实在是很简洁高效。

后话

K-近邻算法(KNN)原理以及代码实现差不多就这样了,接下来的任务就是更加熟悉它,争取达到裸敲的地步。

以上所述上就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
python实现类的静态变量用法实例
May 08 Python
python实现NB-IoT模块远程控制
Jun 20 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
python 获取等间隔的数组实例
Jul 04 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
基于OpenCV的路面质量检测的实现
Nov 04 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 #Python
python中的代码编码格式转换问题
Jun 10 #Python
python实现数独算法实例
Jun 09 #Python
python中的全局变量用法分析
Jun 09 #Python
python简单实现计算过期时间的方法
Jun 09 #Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 #Python
Python实现数据库编程方法详解
Jun 09 #Python
You might like
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
vue实现购物车的监听
2020/04/20 Javascript
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python3对接mysql数据库实例详解
2019/04/30 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
工地资料员岗位职责
2013/12/31 职场文书
工作中个人的自我评价
2013/12/31 职场文书
给同事的道歉信
2014/01/11 职场文书
学校读书活动总结
2014/06/30 职场文书
世界读书日的活动方案
2014/08/20 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
付款证明模板
2015/06/19 职场文书
高二数学教学反思
2016/02/18 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis