设为首页 收藏本站
查看: 489|回复: 0

[经验分享] 机器学习三

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 08:47:32 | 显示全部楼层 |阅读模式
  Python语言实现机器学习的K-近邻算法



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

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

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



1 from numpy import *
2 import operator
3
4 def createDataSet():
5     group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
6     labels = ['A','A','B','B']
7     return group, labels
  
  代码中,我们需要导入Python的两个模块:科学计算包NumPy和运算符模块。NumPy函数库是Python开发环境的一个独立模块,大多数Python版本里没有默认安装NumPy函数库,因此这里我们需要单独安装这个模块。
  下载戳这里:NumPy
   DSC0000.png
  有很多的版本,这里我选择的是numpy-1.7.0-win32-superpack-python2.7.exe。

实现K-近邻算法
  K-近邻算法的具体思想如下:
  (1)计算已知类别数据集中的点与当前点之间的距离
  (2)按照距离递增次序排序
  (3)选取与当前点距离最小的k个点
  (4)确定前k个点所在类别的出现频率
  (5)返回前k个点中出现频率最高的类别作为当前点的预测分类
  Python语言实现K-近邻算法的代码如下:
  



1 # coding : utf-8
2
3 from numpy import *
4 import operator
5 import kNN
6
7 group, labels = kNN.createDataSet()
8
9 def classify(inX, dataSet, labels, k):
10     dataSetSize = dataSet.shape[0]  
11     diffMat = tile(inX, (dataSetSize,1)) - dataSet
12     sqDiffMat = diffMat**2
13     sqDistances = sqDiffMat.sum(axis=1)
14     distances = sqDistances**0.5
15     sortedDistances = distances.argsort()
16     classCount = {}
17     for i in range(k):
18         numOflabel = labels[sortedDistances]
19         classCount[numOflabel] = classCount.get(numOflabel,0) + 1
20     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)
21     return sortedClassCount[0][0]
22
23 my = classify([0,0], group, labels, 3)
24 print my
  
  
  运算结果如下:
   DSC0001.png
   输出结果是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)原理以及代码实现差不多就这样了,接下来的任务就是更加熟悉它,争取达到裸敲的地步。
  加油!!!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144776-1-1.html 上篇帖子: 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器 下篇帖子: 深入理解Python中的生成器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表