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 字符串split的用法分享
Mar 23 Python
python中的多线程实例教程
Aug 27 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
python多进程控制学习小结
Oct 31 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
如何理解Python中的变量
Jun 01 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
Python 如何解决稀疏矩阵运算
May 26 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
劣质的PHP代码简化
2010/02/08 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python 多线程串行和并行的实例
2019/02/22 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python中uuid模块实例浅析
2020/12/29 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
电子商务毕业生求职信
2013/11/10 职场文书
小学清明节活动方案
2014/03/08 职场文书
劲霸男装广告词
2014/03/21 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
工作年限证明模板
2014/11/01 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
党员公开承诺书2015
2015/01/21 职场文书
新郎结婚感言
2015/07/31 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Docker部署Mysql8的实现步骤
2022/07/07 Servers