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之有容乃大的list(3)
Sep 15 Python
Python基础入门之seed()方法的使用
May 15 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
python编写Logistic逻辑回归
Dec 30 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Django 路由控制的实现
Jul 17 Python
python批量图片处理简单示例
Aug 06 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python-for循环的内部机制
Jun 12 Python
基于selenium及python实现下拉选项定位select
Jul 22 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
angular2中使用第三方js库的实例
2018/02/26 Javascript
vue写一个组件
2018/04/09 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
详解python中的模块及包导入
2019/08/30 Python
python socket 聊天室实例代码详解
2019/11/14 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
成教自我鉴定
2013/10/27 职场文书
木工主管岗位职责
2013/12/08 职场文书
校三好学生主要事迹
2014/01/11 职场文书
节能标语大全
2014/06/21 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
公司员工离职感言
2015/08/03 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python