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处理字符串之isspace()方法的使用
May 19 Python
Python+django实现文件上传
Jan 17 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
Python画图高斯分布的示例
Jul 10 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
python爬虫scrapy图书分类实例讲解
Nov 23 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学习教程之第2天
2008/06/15 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
JavaScript中的其他对象
2008/01/16 Javascript
JavaScript confirm选择判断
2008/10/18 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
函授毕业个人自我评价
2014/02/20 职场文书
2015初中政教处工作总结
2015/07/21 职场文书