python机器学习理论与实战(一)K近邻法


Posted in Python onJanuary 28, 2021

机器学习分两大类,有监督学习(supervised learning)和无监督学习(unsupervised learning)。有监督学习又可分两类:分类(classification.)和回归(regression),分类的任务就是把一个样本划为某个已知类别,每个样本的类别信息在训练时需要给定,比如人脸识别、行为识别、目标检测等都属于分类。回归的任务则是预测一个数值,比如给定房屋市场的数据(面积,位置等样本信息)来预测房价走势。而无监督学习也可以成两类:聚类(clustering)和密度估计(density estimation),聚类则是把一堆数据聚成弱干组,没有类别信息;密度估计则是估计一堆数据的统计参数信息来描述数据,比如深度学习的RBM。

根据机器学习实战讲解顺序,先学习K近邻法(K Nearest Neighbors-KNN)

K近邻法是有监督学习方法,原理很简单,假设我们有一堆分好类的样本数据,分好类表示每个样本都一个对应的已知类标签,当来一个测试样本要我们判断它的类别是,就分别计算到每个样本的距离,然后选取离测试样本最近的前K个样本的标签累计投票,得票数最多的那个标签就为测试样本的标签。

例子(电影分类):

python机器学习理论与实战(一)K近邻法

(图一)

(图一)中横坐标表示一部电影中的打斗统计个数,纵坐标表示接吻次数。我们要对(图一)中的问号这部电影进行分类,其他几部电影的统计数据和类别如(图二)所示:

python机器学习理论与实战(一)K近邻法

(图二)

从(图二)中可以看出有三部电影的类别是Romance,有三部电影的类别是Action,那如何判断问号表示的这部电影的类别?根据KNN原理,我们需要在(图一)所示的坐标系中计算问号到所有其他电影之间的距离。计算出的欧式距离如(图三)所示:

python机器学习理论与实战(一)K近邻法

(图三)

     由于我们的标签只有两类,那假设我们选K=6/2=3,由于前三个距离最近的电影都是Romance,那么问号表示的电影被判定为Romance。

代码实战(Python版本):

先来看看KNN的实现:

from numpy import * 
import operator 
from os import listdir 
 
 
def classify0(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 #计算距离 
 sortedDistIndicies = distances.argsort() #距离排序 
 classCount={}   
 for i in range(k): 
  voteIlabel = labels[sortedDistIndicies[i]] #前K个距离最近的投票统计 
  classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #前K个距离最近的投票统计 
 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #对投票统计进行排序 
 return sortedClassCount[0][0] #返回最高投票的类别

下面取一些样本测试KNN:

def file2matrix(filename): 
 fr = open(filename) 
 numberOfLines = len(fr.readlines())   #get the number of lines in the file 
 returnMat = zeros((numberOfLines,3))  #prepare matrix to return 
 classLabelVector = []      #prepare labels return  
 fr = open(filename) 
 index = 0 
 for line in fr.readlines(): 
  line = line.strip() 
  listFromLine = line.split('\t') 
  returnMat[index,:] = listFromLine[0:3] 
  classLabelVector.append(int(listFromLine[-1])) 
  index += 1 
 return returnMat,classLabelVector 
  
def autoNorm(dataSet): 
 minVals = dataSet.min(0) 
 maxVals = dataSet.max(0) 
 ranges = maxVals - minVals 
 normDataSet = zeros(shape(dataSet)) 
 m = dataSet.shape[0] 
 normDataSet = dataSet - tile(minVals, (m,1)) 
 normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide 
 return normDataSet, ranges, minVals 
  
def datingClassTest(): 
 hoRatio = 0.50  #hold out 50% 
 datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')  #load data setfrom file 
 normMat, ranges, minVals = autoNorm(datingDataMat) 
 m = normMat.shape[0] 
 numTestVecs = int(m*hoRatio) 
 errorCount = 0.0 
 for i in range(numTestVecs): 
  classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) 
  print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) 
  if (classifierResult != datingLabels[i]): errorCount += 1.0 
 print "the total error rate is: %f" % (errorCount/float(numTestVecs)) 
 print errorCount

上面的代码中第一个函数从文本文件中读取样本数据,第二个函数把样本归一化,归一化的好处就是降低样本不同特征之间数值量级对距离计算的显著性影响

datingClassTest则是对KNN测试,留了一半数据进行测试,文本文件中的每条数据都有标签,这样可以计算错误率,运行的错误率为:the total error rate is: 0.064000

总结:

优点:高精度,对离群点不敏感,对数据不需要假设模型

缺点:判定时计算量太大,需要大量的内存

工作方式:数值或者类别

下面挑选一步样本数据发出来:

python机器学习理论与实战(一)K近邻法

参考文献:machine learning in action

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多线程http下载实现示例
Dec 30 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python数据结构之Array用法实例
Oct 09 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
解析Python中的__getitem__专有方法
Jun 27 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
解决django model修改添加字段报错的问题
Nov 18 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
python机器学习理论与实战(六)支持向量机
Jan 19 #Python
Python logging管理不同级别log打印和存储实例
Jan 19 #Python
python机器学习理论与实战(五)支持向量机
Jan 19 #Python
Python读取图片为16进制表示简单代码
Jan 19 #Python
Python实现pdf文档转txt的方法示例
Jan 19 #Python
浅谈Python实现2种文件复制的方法
Jan 19 #Python
用Python进行简单图像识别(验证码)
Jan 19 #Python
You might like
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php从字符串创建函数的方法
2015/03/16 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
python对字典进行排序实例
2014/09/25 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python实现电子书翻页小程序
2019/07/23 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
python开发前景如何
2020/06/11 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
房地产销售大学生自我评价分享
2013/11/11 职场文书
建筑结构施工求职信
2014/07/11 职场文书
世界气象日活动总结
2015/02/27 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
JavaScript canvas实现流星特效
2021/05/20 Javascript
CSS3实现指纹特效代码
2022/03/17 HTML / CSS