版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【机器学习】k-近邻算法以及算法实例时间 2015-01-26 14:31:00 博客园-原创精华区原文 主题 算法 数据挖掘机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法。一、kNN算法的工作原理二、适用情况三、算法实例及讲解-1.收集数据-2.准备数据-3.设计算法分析数据-4.测试算法一、kNN算法的工作原理官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个
2、特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数,最后,选择k个最相似的数据中出现次数最多的分类,作为新数据的分类。我的理解:k-近邻算法就是根据“新数据的分类取决于它的邻居”进行的,比如邻居中大多数都是退伍军人,那么这个人也极有可能是退伍军人。而算法的目的就是先找出它的邻居,然后分析这几位邻居大多数的分类,极有可能就是它本省的分类。二、适用情况优点:精度高,对异常数据不敏感(你的类别是由邻居中的大多数决定的,一个异常邻居并不能影响太大),无数
3、据输入假定;缺点:计算发杂度高(需要计算新的数据点与样本集中每个数据的“距离”,以判断是否是前k个邻居),空间复杂度高(巨大的矩阵);适用数据范围:数值型(目标变量可以从无限的数值集合中取值)和标称型(目标变量只有在有限目标集中取值)。三、算法实例及讲解例子中的案例摘机器学习实战一书中的,代码例子是用python编写的(需要matplotlib和numpy库),不过重在算法,只要算法明白了,用其他语言都是可以写出来的:海伦一直使用在线约会网站寻找合适自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:1.不喜欢的人( 以下
4、简称1 );2.魅力一般的人( 以下简称2 ) ;3.极具魅力的人(以下简称3 ) 尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当的分类。她觉得可以在周一到周五约会哪些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好的帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。我们先提取一下这个案例的目标:根据一些数据信息,对指定人选进行分类(1或2或3)。为了使用kNN算法达到这个目标,我们需要哪些信息?前面提到过,就是需要样本
5、数据,仔细阅读我们发现,这些样本数据就是“ 海伦还收集了一些约会网站未曾记录的数据信息 ”。好的,下面我们就开始吧! -1.收集数据海伦收集的数据是记录一个人的三个特征:每年获得的飞行常客里程数;玩视频游戏所消耗的时间百分比;每周消费的冰淇淋公升数。数据是txt格式文件,如下图,前三列依次是三个特征,第四列是分类(1:不喜欢的人,2:魅力一般的人,3:极具魅力的人),每一行代表一个人。数据文档的下载链接是:- 2.准备数据何为准备数据?之前收集到了数据,放到了txt格式的文档中了,看起来也比较规整,但是计算机并不认识啊。计算机需要从txt文档中读取数据,
6、并把数据进行格式化,也就是说存到矩阵中,用矩阵来承装这些数据,这样才能使用计算机处理。需要两个矩阵:一个承装三个特征数据,一个承装对应的分类。于是,我们定义一个函数,函数的输入时数据文档(txt格式),输出为两个矩阵。代码如下: 1 def file2matrix(filename): 2 fr = open(filename) 3 numberOfLines = len(fr.readlines() 4 returnMat = zeros(numberOfLines, 3) 5 classLabelVector = 6 fr = open(filename) 7 index = 0 8 fo
7、r line in fr.readlines(): 9 line = line.strip()10 listFromLine = line.split('t')11 returnMatindex, : = listFromLine0:312 classLabelVector.append(int(listFromLine-1)13 index += 114 return returnMat, classLabelVector简要解读代码:首先打开文件,读取文件的行数,然后初始化之后要返回的两个矩阵(returnMat、classLabelsVector),然后进入循环,将每行的
8、数据各就各位分配给returnMat和classLabelsVector。-3.设计算法分析数据k-近邻算法的目的就是找到新数据的前k个邻居,然后根据邻居的分类来确定该数据的分类。首先要解决的问题,就是什么是邻居?当然就是“距离”近的了,不同人的距离怎么确定?这个有点抽象,不过我们有每个人的3个特征数据。每个人可以使用这三个特征数据来代替这个人三维点。比如样本的第一个人就可以用(40920, 8.326976, 0.953952)来代替,并且他的分类是3。那么此时的距离就是点的距离:A点(x1, x2, x3),B点(y1, y2, y3),这两个点的距离就是:(x1-y1)2+(x2-y2)
9、2+(x3-y3)2的平方根。求出新数据与样本中每个点的距离,然后进行从小到大排序,前k位的就是k-近邻,然后看看这k位近邻中占得最多的分类是什么,也就获得了最终的答案。这个处理过程也是放到一个函数里的,代码如下: 1 def classify0(inX, dataSet, labels, k): 2 dataSetSize = dataSet.shape0 3 diffMat = tile(inX, (dataSetSize,1) - dataSet 4 sqDiffMat = diffMat*2 5 sqDistances = sqDiffMat.sum(axis=1) 6 distanc
10、es = sqDistances*0.5 7 sortedDistIndicies = distances.argsort() 8 classCount= 9 for i in range(k):10 voteIlabel = labelssortedDistIndiciesi11 classCountvoteIlabel = classCount.get(voteIlabel,0) + 112 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)13 return
11、sortedClassCount00简要解读代码:该函数的4个参数分别为新数据的三个特征inX、样本数据特征集(上一个函数的返回值)、样本数据分类(上一个函数的返回值)、k,函数返回位新数据的分类。第二行dataSetSize获取特征集矩阵的行数,第三行为新数据与样本各个数据的差值,第四行取差值去平方,之后就是再取和,然后平方根。代码中使用的排序函数都是python自带的。好了,现在我们可以分析数据了,不过,有一点不知道大家有没有注意,我们回到那个数据集,第一列代表的特征数值远远大于其他两项特征,这样在求距离的公式中就会占很大的比重,致使两点的距离很大程度上取决于这个特征,这当然是不公平的,我
12、们需要的三个特征都均平地决定距离,所以我们要对数据进行处理, 希望处理之后既不影响相对大小又可以不失公平 :这种方法叫做,归一化数值,通过这种方法可以把每一列的取值范围划到01或-11:,处理的公式为:newValue = (oldValue - min)/(max - min)归一化数值的函数代码为:1 def autoNorm(dataSet):2 minVals = dataSet.min(0)3 maxVals = dataSet.max(0)4 ranges = maxVals - minVals5 normDataSet = zeros(shape(dataSe
13、t)6 m = dataSet.shape07 normDataSet = dataSet - tile(minVals, (m, 1)8 normDataSet = normDataSet / tile(ranges, (m, 1)9 return normDataSet, ranges, minVals-4.测试算法经过了格式化数据、归一化数值,同时我们也已经完成kNN核心算法的函数,现在可以测试了,测试代码为: 1 def datingClassTest(): 2 hoRatio = 0.10 3 datingDataMat, datingLabels = file2matrix(
14、9;datingTestSet.txt') 4 normMat, ranges, minVals = autoNorm(datingDataMat) 5 m = normMat.shape0 6 numTestVecs = int(m * hoRatio) 7 errorCount = 0.0 8 for i in range(numTestVecs): 9 classifierResult = classify0(normMati, :, normMatnumTestVecs:m, :, datingLabelsnumTestVecs:m, 3)10 print "the
15、classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabelsi)11 if (classifierResult != datingLabelsi): errorCount += 1.012 print "the total error rate is: %f" % (errorCount / float(numTestVecs)通过测试代码我们可以在回忆一下这个例子的整体过程:· 读取txt文件,提取里面的数据到datingDataMat、
16、datingLabels;· 归一化数据,得到归一化的数据矩阵;· 测试数据不止一个,这里需要一个循环,依次对每个测试数据进行分类。代码中大家可能不太明白hoRatio是什么。注意,这里的测试数据并不是另外一批数据而是之前的数据集里的一部分,这样我们可以把算法得到的结果和原本的分类进行对比,查看算法的准确度。在这里,海伦提供的数据集又1000行,我们把前100行作为测试数据,后900行作为样本数据集,现在大家应该可以明白hoRatio是什么了吧。整体的代码: 1 from numpy import * 2 import operator 3 4 def classify0(
17、inX, dataSet, labels, k): 5 dataSetSize = dataSet.shape0 6 diffMat = tile(inX, (dataSetSize,1) - dataSet 7 sqDiffMat = diffMat*2 8 sqDistances = sqDiffMat.sum(axis=1) 9 distances = sqDistances*0.510 sortedDistIndicies = distances.argsort()11 classCount=12 for i in range(k):13 voteIlabel = labelssort
18、edDistIndiciesi14 classCountvoteIlabel = classCount.get(voteIlabel,0) + 115 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)16 return sortedClassCount0017 18 def file2matrix(filename):19 fr = open(filename)20 numberOfLines = len(fr.readlines()21 returnMat =
19、zeros(numberOfLines, 3)22 classLabelVector = 23 fr = open(filename)24 index = 025 for line in fr.readlines():26 line = line.strip()27 listFromLine = line.split('t')28 returnMatindex, : = listFromLine0:329 classLabelVector.append(int(listFromLine-1)30 index += 131 return returnMat, classLabel
20、Vector 32 33 def autoNorm(dataSet):34 minVals = dataSet.min(0)35 maxVals = dataSet.max(0)36 ranges = maxVals - minVals37 normDataSet = zeros(shape(dataSet)38 m = dataSet.shape039 normDataSet = dataSet - tile(minVals, (m, 1)40 normDataSet = normDataSet / tile(ranges, (m, 1)41 return normDataSet, ranges, minVa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 细胞凋亡与骨关节炎
- 基于设计思维教学法的小学语文项目式学习理念与实践模型
- 护理硕士研究生心理资本潜在剖面分析及与情绪幸福感的关系
- 国际志愿者日活动策划
- 湖南省张家界市桑植县2024-2025学年七年级上学期道德与法治期末试卷(含答案)
- 第十八章 平行四边形 评估测试卷(含答案)2024-2025学年数学人教版八年级下册
- 二零二五年度房产共同债权债务处理离婚协议3篇
- 贵州盛华职业学院《影视栏目包装专题设计》2023-2024学年第一学期期末试卷
- 贵州黔南科技学院《设计原理》2023-2024学年第一学期期末试卷
- 新疆巴音郭楞蒙古自治州(2024年-2025年小学六年级语文)人教版课后作业(下学期)试卷及答案
- 英法核动力装置
- GB/T 41837-2022温泉服务温泉水质要求
- YS/T 79-2006硬质合金焊接刀片
- 考研考博-英语-山东师范大学押题密卷附带答案详解篇
- 实用性阅读与交流任务群设计思路与教学建议
- 中医诊疗器具清洗消毒(医院感染防控专家课堂培训课件)
- 通风设施标准
- 药厂生产车间现场管理-PPT课件
- 轴与孔标准公差表
- 防火门施工方案
- 人教PEP版2022-2023六年级英语上册期末试卷及答案(含听力材料)
评论
0/150
提交评论