机器学习实战之K近邻算法

k近邻算法概述
简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类。

优 点 :精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。

它的工作原理是:存在一个样本数 据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K近邻算法中K的出处,通常K是不大于20的整数。 最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。

K近邻算法的一般流程
(1)收集数据:可以使用任何方法。
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3)分析数据:可以使用任何方法。
(4)训练算法:此步驟不适用于1 近邻算法。
(5)测试算法:计算错误率。
(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

K近邻算法伪代码实现
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离,常常使用欧氏距离公式;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的K个点;
(4)确定前K个点所在类别的出现频率;
(5)返回前K个点出现频率最高的类别作为当前点的预测分类。

def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]diffMat = tile(inX, (dataSetSize, 1)) - dataSetsqDiffMat = diffMat ** 2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances ** 0.5sortedDistIndicies = distances.argsort()classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]

使用k近邻算法改进约会网站的配对效果

(1)收集数据:提供文本文件。
(2)准备数据: 使用python解析文本文件。
(3)使用Matplotlib画二维扩散图
(4)训练算法:此步驟不适用于k近邻算法。
(5)测试算法:使用海伦提供的部分数据作为测试样本。
测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
(6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。

从文本文件中解析数据
海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件中 ,每 个样本数据占据一行,总共有1000行。海伦的样本主要包含以下3种特征:
□ 每年获得的飞行常客里程数
□ 玩视频游戏所耗时间百分比
□ 每周消费的冰淇淋公升数

我们通过file2matrix函数读入数据,该函数的输人为文 件名字符串 输出为训练样本矩阵和类标签向量。

def file2matrix(filename):fr = open(filename)numberOfLines = len(fr.readlines())  # get the number of lines in the filereturnMat = zeros((numberOfLines, 3))  # prepare matrix to returnclassLabelVector = []  # prepare labels returnfr = open(filename)index = 0for line in fr.readlines():line = line.strip()listFromLine = line.split('\t')returnMat[index, :] = listFromLine[0:3]classLabelVector.append(int(listFromLine[-1]))index += 1return returnMat, classLabelVector

分析数据:使用matplotlib创建散点图

在python命令环境下,输入下列命令

import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:2])
plt.show()


由于没有使用样本分类特征值,我们很难从图中看到有用的数据模式信息。

重新输入上面的代码,调用scatter函数时使用如下代码:
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))

数据归一化
我们很容易发现,上面方程中数字差值最大的属性对计算结果的影响最大,也就是说,每年获取的飞行常客里程数对于计算结果的影响将远远大于表2-3中其他两个特征— 玩视频游戏的 和每周消费冰洪淋公升数— 的影响。而产生这种现象的唯一原因,仅仅是因为飞行常客里程数 远大于其他特征值。但海伦认为这三种特征是同等重要的,因此作为三个等权重的特征之一,飞 行常客里程数并不应该如此严重地影响到计算结果。

在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1区间内的值:
newValue=(oldValue-min)/(max-min)
其中min和max分别是数据集中的最小特征值和最大特征值。虽然改变数值取值范围增加了 分类器的复杂度,但为了得到准确结果,我们必须这样做

def autoNorm(dataSet):minVals = dataSet.min(0)maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))m = dataSet.shape[0]normDataSet = dataSet - tile(minVals, (m, 1))normDataSet = normDataSet / tile(ranges, (m, 1))  # element wise dividereturn normDataSet, ranges, minVals

测试算法
前面我们巳经提到可以使用错误率来检测分类器的性能。对于分类器来说,错误率就是分类器给出错误结果的次数除以测试数据的总数,完美分类器的错误率为0,而错误率为1.0的分类器 不会给出任何正确的分类结果。代码里我们定义一个计数器变量,每次分类器错误地分类数据,计数器就加1,程序执行完成之后计数器的结果除以数据点总数即是错误率。

def datingClassTest():hoRatio = 0.50  # hold out 10%datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')  # load data setfrom filenormMat, ranges, minVals = autoNorm(datingDataMat)m = normMat.shape[0]numTestVecs = int(m * hoRatio)errorCount = 0.0for 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.0print "the total error rate is: %f" % (errorCount / float(numTestVecs))print errorCount

分类器处理约会数据集的错误率是2.4%,这是一个相当不错的结果。依赖于分类算法、数据集和程序设置,分类器的输出结果可能有很大的不同。
这个例子表明我们可以正确地预测分类,错误率仅仅是2.4%。海伦完全可以输人未知对象的属性信息’由分类软件来帮助她判定某一对象的可交往程度:讨厌、一般喜欢、非常喜欢。

手写识别系统

本节我们一步步地构造使用K-近邻分类器的手写识别系统。为了简单起见,这里构造的系统只能识别数字0到9,参见图2.6。需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小®:宽髙是32像素*32像素的黑白图像。尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理解,我们还是将图像转换为文本格式。

(1)收集数据:提供文本文件。
(2)准备数据:编写函数classify0(),将图像格式转换为分类器使用的list格式。
(3)分析数据:在python命令提示符中检查数据,确保它符合要求。
(4)训 练 算 法 :此步驟不适用于各近邻算法。
(5)测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记
为一个错误。
(6)使用算法:本例没有完成此步驟,若你感兴趣可以构建完整的应用程序,从图像中提取数字,并完成数字识别,美国的邮件分拣系统就是一个实际运行的类似系统


为了使用前面两个例子的分类器,我们必须将图像格式化处理为一个向量。我们将把一个32*32的二进制图像矩阵转换为1*1024的向量,这样前两节使用的分类器就可以处理数字图像信息了。
我们首先编写一段函数img2vector将图像转换为向量:该函数创建1*1024的numpy数组,然后打开给定的文件,循环读出文件的前32行,并将每行的头32个字符值存储在numpy数 组 中,最后返回数组。

def img2vector(filename):returnVect = zeros((1, 1024))fr = open(filename)for i in range(32):lineStr = fr.readline()for j in range(32):returnVect[0, 32 * i + j] = int(lineStr[j])return returnVect

测试算法

def handwritingClassTest():hwLabels = []trainingFileList = listdir('trainingDigits')  # load the training setm = len(trainingFileList)trainingMat = zeros((m, 1024))for i in range(m):fileNameStr = trainingFileList[i]fileStr = fileNameStr.split('.')[0]  # take off .txtclassNumStr = int(fileStr.split('_')[0])hwLabels.append(classNumStr)trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)testFileList = listdir('testDigits')  # iterate through the test seterrorCount = 0.0mTest = len(testFileList)for i in range(mTest):fileNameStr = testFileList[i]fileStr = fileNameStr.split('.')[0]  # take off .txtclassNumStr = int(fileStr.split('_')[0])vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)if (classifierResult != classNumStr): errorCount += 1.0print "\nthe total number of errors is: %d" % errorCountprint "\nthe total error rate is: %f" % (errorCount / float(mTest))

K-近邻算法识别手写数字数据集,错误率为1.2%
实际使用这个算法时,算法的执行效率并不高。因为算法需要为每个测试向量做2000次距离计算,每个距离计算包括了1024个维度浮点运算,总计要执行900次,此外,我们还需要为测试向量准备2MB的存储空间。是否存在一种算法减少存储空间和计算时间的开销呢?k决策树就是K-近邻算法的优化版,可以节省大量的计算开销。

总结
K-近邻算法是分类数据最简单最有效的算法,本章通过两个例子讲述了如何使用K-近邻算法构造分类器。K-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数 据。K-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络的叛离:32年前从心理学与生理学分离的瞬间

来源:大数据文摘编译:Andy反向传播算法隶属于深度学习,它在解决模型优化问题的方面有着重要的地位。这一算法由被誉为深度学习之父的Geoffrey Hinton提出。1986年,他发表了名为Learning representations by back-propagating erro…

希尔排序-插入改进

引自:http://hi.baidu.com/gsgaoshuang/item/17a8ed3c24d9b1ba134b14c2 学习算法的一个好网站 http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.2.1.htm 希尔排序(Shell Sort)又称为缩小增量排序,输入插入…

机器学习实战之决策树

你是否玩过二十个问题的游戏,游戏的规则很简单:参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答。问问题的人通过 推断分解,逐步缩小待猜测事物的范围。决策树的工作原理与20个问题类似,用户输人一系列数 据,然后给出游…

细嚼慢咽C++primer(4)——类(1):构造函数,类型别名

1 最简单地说,类即使定义了一个新的类型和一个新的作用域。 2 基础 1 构造函数 构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员。 Sales_item(): units_sold(0), revenue(0.0) {}; 2 成员函数 在类内部定义的函数默认为inline. …

2018全球硬科技创新暨“一带一路”创新合作大会,这些硬科技都要来!

来源:新华社近年来,多个省市陆续开始了一场科技标签秀,以深圳等为代表的“人工智能”、以上海为代表的“金融科技”,以贵州为代表的“大数据”等纷纷亮相,而伴随着“一带一路”新丝路的战略实施,西安&#…

吴恩达:人工智能寒冬不会到来,但我们太乐观了

来源:量子位AI Winter Is Coming?人工智能领域的各路专家学者曾经为这个话题吵翻了天。最近,这个话题又有更新了。人工智能寒冬论的作者Filip Piekniewski在博客上发文,给自己提出的观点增加了新的证据。非常巧的是,吴…

SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复

SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复 误删除表需要恢复该表,要注意几个问题, 第一 删除表后是否新建表了 是否插入数据了。 第二 删除表后是否立即关闭SQL服务了/ 第三 数据库是否是完整模式 我们先来了解下 删除表做了那些操作&…

自动驾驶中常用的四类机器学习算法

来源:智车科技机器学习算法已经被广泛应用于自动驾驶各种解决方案,电控单元中的传感器数据处理大大提高了机器学习的利用率,也有一些潜在的应用,比如利用不同外部和内部的传感器的数据融合(如激光雷达、雷达、摄像头或物联网)&…

CSS样式如何解决IE浏览器不同版本的兼容问题

如果你想让浏览器是固定的IE6版本&#xff0c;那么你做网页的时候在<head>后面加上一句话&#xff1a; <meta http-equiv"X-UA-Compatible" content"IEEmulateIE6" /> 把这句话加在<head>标签后面第一句话就OK了。注意&#xff0c;再强调…

国际基因编辑科技发展报告

来源&#xff1a;全球技术地图作者&#xff1a;贾晓峰 中国科学技术信息研究所摘要&#xff1a;以特异性的改变遗传物质靶向基因序列为目标的基因编辑技术是近年生命科学领域最热门的研究领域之一。围绕基因编辑的相关领域研究和人物事件连续多年入选Nature国际科学事件和科学人…

各大主流.Net的IOC框架性能测试比较

http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html转载于:https://www.cnblogs.com/PatrickLee/p/3347322.html

Help View修复

好吧&#xff0c;手贱把ProgramData里关于Help View的某些数据删除了 (在任何情况下都不要删除此文件夹中的任何数据)。即使卸载后重新安装也出现错误&#xff0c;可以参考的http://social.msdn.microsoft.com/Forums/vstudio/pt-BR/8525617e-6300-415f-8980-8658ba0045ef/visu…

科学家发现大脑动态评估信息重要性机制

大脑中部的丘脑室旁核&#xff08;PVT&#xff09; 图片来源&#xff1a;中科院深圳先进技术研究院来源&#xff1a;中国科学报周末该在家看书还是出去K歌&#xff1f;寒冬将至&#xff0c;该坚持健身还是涮个火锅&#xff1f;每天&#xff0c;人们都会面临上百种选择。以往&am…

JS 利用数组拼接html字符串

var cc []; cc.push(<td colspan fields.length style"padding:10px 5px;border:0;">); cc.push(</td>); return cc.join(); 转载于:https://www.cnblogs.com/101key/p/3349143.html

腾讯AI Lab研发「智能显微镜」 抢先布局病理分析领域

来源&#xff1a;腾讯AI实验室腾讯 AI Lab 在南京举办的「腾讯全球合作伙伴大会」上宣布&#xff0c;其AI医疗领域研究已抢先从影像筛查进入病理分析阶段&#xff0c;相关的「智能显微镜」项目已在研发测试阶段。智能显微镜融入了人工智能&#xff08;AI&#xff09;的视觉、语…

石墨烯新新新应用,MIT大规模生产细胞大小机器人,有感知能存储

&#xff08;MIT开发的微型机器人&#xff09;来源&#xff1a;机器人大讲堂近期&#xff0c;MIT又玩出了新花样&#xff0c;在前几个月成功开发出细胞大小并且能够感知外部环境、储存数据并执行计算任务的微型机器人后&#xff0c;MIT又带来了新消息&#xff1a;他们为大规模生…

windows 批处理-重命名

从数字1递增批量重命名ren.bat&#xff1a; echo off SETLOCAL ENABLEDELAYEDEXPANSION set /A num0 FOR /F "tokens*" %%i in (dir /A-D /B /OD /TC) do ( IF NOT "%%i""%~n0%~x0" ( set /A num1 ren "%%i" "!num!%%~xi&quo…

多种图像配准方法的综合比较(KAZE、SIFT、SURF等)

接触图像配准是从去年十月份开始的&#xff0c;老师要求我尽快重现一遍整个流程&#xff0c;这样对课题可以有一个整体的把握&#xff0c;而后再仔细推敲细节&#xff0c;甚至提出自己的想法&#xff0c;老师的这个思路现在觉得非常不错。自己当时选取的是SURF方法&#xff0c;…

全面梳理百度世界大会:量产L4乘用车和两款音箱 还有挖掘机技术

来源&#xff1a;网易智能摘要&#xff1a;今天&#xff0c;百度一年一度的世界大会如约而至&#xff0c;李彦宏宣布发布量产红旗L4级乘用车&#xff0c;推出两款小度语音智能产品和智能城市“ACE计划”。多年以来&#xff0c;百度世界大会和AI开发者大会成为百度对外的窗口&am…

图像处理中的通信原理——冈萨雷斯读书笔记(一)

信息的概念在信息论中很明确&#xff1a;用于衡量事件的不确定性。信息的传播形式或者所载体便是信号&#xff0c;比如说电信号、光信号、声音信号。那么信息的表现形式就是消息&#xff0c;可以是语言、文字、图像。所以说图像处理依然是信息与通信领域的一部分。它可以看作是…