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迭代器实例简析
Sep 25 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
python3实现基于用户的协同过滤
May 31 Python
python进行两个表格对比的方法
Jun 27 Python
flask-restful使用总结
Dec 04 Python
python命令行工具Click快速掌握
Jul 04 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
python/golang 删除链表中的元素
Sep 14 Python
python文件与路径操作神器 pathlib
Apr 01 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/16 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
Windows下python3.7安装教程
2018/07/31 Python
python模拟实现斗地主发牌
2020/01/07 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Keras loss函数剖析
2020/07/06 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
python regex库实例用法总结
2021/01/03 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
社区母亲节活动记录
2014/03/06 职场文书
销售代理协议书
2014/09/30 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Python超简单容易上手的画图工具库推荐
2021/05/10 Python