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开启多个子进程并行运行的方法
Apr 18 Python
老生常谈python之鸭子类和多态
Jun 13 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python实现教务管理系统
Mar 12 Python
centos7之Python3.74安装教程
Aug 15 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python enumerate内置函数用法总结
Jan 07 Python
python add_argument()用法解析
Jan 29 Python
Python接收手机短信的代码整理
Aug 02 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
造型师求职自荐信
2013/09/27 职场文书
通信工程毕业生求职信
2013/11/16 职场文书
投标承诺书范本
2014/03/27 职场文书
学生手册评语
2014/05/05 职场文书
地球一小时宣传标语
2014/06/24 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
婚育证明样本
2015/06/16 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
初中生物教学反思
2016/02/20 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
python 提取html文本的方法
2021/05/20 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python