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中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
python实现将元祖转换成数组的方法
May 04 Python
python基础教程之Filter使用方法
Jan 17 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
python 杀死自身进程的实现方法
Jul 01 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
Pycharm Git 设置方法
Sep 15 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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和ACCESS写聊天室(二)
2006/10/09 PHP
php 文章采集正则代码
2009/12/28 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
详解python的四种内置数据结构
2019/03/19 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
工商学院毕业生自荐信
2013/11/12 职场文书
环境科学专业个人求职的自我评价
2013/11/28 职场文书
三爱活动实施方案
2014/03/19 职场文书
离婚承诺书格式范文
2015/05/04 职场文书