机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

关键字:邻近算法(kNN: k Nearest Neighbors)、python、源码解析、测试
作者:米仓山下
时间:2018-10-21
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
git@github.com:pbharrin/machinelearninginaction.git

*************************************************************
一、邻近算法(KNN)

原理:存在一个样本数据集合(训练样本),并且样本集中每个数据都存在标签(知道每个样本所属类别),输入没有标签的新数据(测试数据),将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签,一般只选择k个最相似的数据,通常k不超过20的整数,最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

#KNN实现函数
Input:inX: 待分类数据向量(1xN); dataSet:已知分类的m条数据集(NxM);labels:数据类别标签(1xM vector);k:KNN的最邻近数据个数阈值
Output:最可能的类别标签

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): #计算k个数据中,各类别出现的次数
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#排序
return sortedClassCount[0][0] #返回出现次数最多的类别

*************************************************************
二、kNN.py中其他方法

classify0----KNN实现函数
createDataSet----创建测试数据集,4×2,两个特征,四条数据;标签为1×4,对应为类别
file2matrix----读取数据创建为32×32的矩阵,用来处理手写体数字识别的数据处理,将文本文件中的数据处理成矩阵。
autoNorm----归一化函数:(value-minValue)/(maxValue-minValue),将传入的数据集进行归一化处理,归一化将所有特征的取值压缩到0-1之间(或-1到1之间),可以消除不同特征取值在不同数量级所造成的不同特征重要性不均等的情况。

#约会数据测试
datingClassTest----已完成分类的数据为datingTestSet2.txt中。
数据说明:前三列为特征——每年获得的飞行常客里程数,玩视频游戏所耗时间百分比,每周消费冰淇淋公升数;最后一类为类别——不喜欢的人,魅力一般的人,极具魅力的人。
通过hoRatio来控制训练和测试数据比例,classifierResult为测试所得的类别,方法中还通过与真实类别比较,然后统计错误率和错误数
------------------------------------------------------------
#手写体数字识别(0-9)
handwritingClassTest----手写体识别数字示例,已知类别(0-9十个数字)数据,已经处理成32×32的0-1矩阵数据。
数据说明:训练数据位于trainingDigits文件夹内,里面的文本文件命名规则为:"_"之前为该文件实际对应的数字;每个文件里面为32×32的矩阵,通过0-1来表示对应的数据

img2vector----2×32的0-1矩阵数据文件读取后转换为1×1024的向量

------------------------------------------------------------
测试:
import kNN
>>> kNN.datingClassTest()#约会数据测试
the classifier came back with: 3, the real answer is: 3
the classifier came back with: 2, the real answer is: 2
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
                        ……
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 2, the real answer is: 2
the total error rate is: 0.064000
32.0

>>> kNN.handwritingClassTest()#手写体数字识别(0-9)
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9
                        ……
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9

the total number of errors is: 11

the total error rate is: 0.011628

*************************************************************
三、利用matplotlib绘制散点图

python createFirstPlot.py

(图datingTestSet2)
python createDist2.py

(图createDist2)
*************************************************************

总结:方法无法持久化,每次测试都要计算一遍

机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)的更多相关文章

  1. 学习笔记之机器学习实战 (Machine Learning in Action)

    机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中 ...

  2. K近邻 Python实现 机器学习实战(Machine Learning in Action)

    算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...

  3. 机器学习实战 [Machine learning in action]

    内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...

  4. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  5. Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记

    Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...

  6. 【python与机器学习实战】感知机和支持向量机学习笔记(一)

    对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...

  7. Machine Learning(Andrew Ng)学习笔记

    1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...

  8. Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)

    我们如今開始训练模型,还输入參数例如以下: rank:ALS中因子的个数.通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间. iterations:迭代次数,每次迭代都会降 ...

  9. Machine Learning With Spark学习笔记(提取10万电影数据特征)

    注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...

随机推荐

  1. centos6 Linux安装redis 2.6.14

    1.获取安装文件 wget http://download.redis.io/redis-stable.tar.gz 2.解压文件 tar xzvf redis-stable.tar.gz 3.进入目 ...

  2. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  3. GO入门——1.基础

    1 安装配置与命令 GOROOT:Go根目录 GOPATH:GO工作目录,其目录下需要建立一下三个子目录 bin :存放编译后生成的可执行文件 pkg :存放编译后生成的包文件 src :存放项目源码 ...

  4. find_package()的查找*.cmake的顺序

    1. find_package(<Name>)命令首先会在模块路径中寻找 Find<name>.cmake,这是查找库的一个典型方式.具体查找路径依次为CMake: 变量${C ...

  5. Linux添加防火墙、iptables的安装和配置(亲测)

    iptables基础 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”.规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源 ...

  6. 【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver

    首先,我们得清楚为何要解耦? 耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改.这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少.我I ...

  7. SpringBoot入门 (十一) 数据校验

    本文记录学习在SpringBoot中做数据校验. 一 什么是数据校验 数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数 ...

  8. 获取呈现在格表(table)记录的主键

    用mouse点击表格(table)的行或是批定列,获取记录的主键值.在ASP.NET的MVC应用程序中,已经没有办法象ASP.NET的Data控件一样,如GridView,DataList和Repea ...

  9. vue-cli中配置屏幕自适应(px2rem)

    在vue-cli中配置屏幕自适应的方法 首先,我们需要安装flexible库. npm i lib-flexible --save 在index.html文件当中配置meta标签, <meta ...

  10. gulp自动添加版本号过程中的一些要点记录

    1.打开node_modules\gulp-rev\index.js 第144行 manifest[originalFile] = revisionedFile; 更新为: manifest[orig ...