机器学习之K-近邻算法
声明:本篇博文是学习《机器学习实战》一书的方式路程,系原创,若转载请标明来源。
1. K-近邻算法的一般流程:
(1)收集数据:可以使用任何方法(如爬虫)。
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3)分析数据:可以使用任何方法。
(4)测试算法:计算误差率。
(5)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
2. K-近邻算法的伪代码和Python代码
对未知类别属性的数据集中的每个点依次执行以下操作:
(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]
代码解释:
(1)classify0()函数的四个输入参数:inX 用于分类的输入向量,dataSet是输入的训练样本集,labels是标签向量,最后k是用于选择最近邻的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。
(2)代码中测量两个对象距离的方法是欧几里得公式:
(3)shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。
(4)tile函数是模板numpy.lib.shape_base中的函数。函数的形式是tile(A,reps)
A的类型几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int, string, float以及bool类型。
reps的类型也很多,可以是tuple,list, dict, array, int,bool.但不可以是float, string, matrix类型。行列重复copy的次数。
(5)sum函数中加入参数。sum(a,axis=0)或者是.sum(axis=1) ,axis=0 就是普通的相加 ;加入axis=1以后就是将一个矩阵的每一行向量相加。
(6)argsort函数返回的是数组值从小到大的索引值。
(7) get() 函数返回字典指定键的值,如果值不在字典中返回默认值。
(8)sorted进行排序,sorted(iterable, cmp=None, key=None, reverse=False)
iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定;
key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。
3 示例-使用K-近邻算法改进约会网站的配对效果
3.1 准备数据:从文本文件中解析数据
将待处理数据的格式改变为分类器可以接收的格式。
代码实现:
1 def file2matrix(filename): 2 fr = open(filename) 3 numberOfLines = len(fr.readlines()) #get the number of lines in the file 4 returnMat = zeros((numberOfLines,3)) #prepare matrix to return 5 classLabelVector = [] #prepare labels return 6 fr = open(filename) 7 index = 0 8 for line in fr.readlines(): 9 line = line.strip() 10 listFromLine = line.split('\t') 11 returnMat[index,:] = listFromLine[0:3] 12 classLabelVector.append(int(listFromLine[-1])) 13 index += 1 14 return returnMat,classLabelVector
代码解释:
(1)file2matrix ()函数的参数,filename接收文件名。
(2)open(路径+文件名,读写模式),读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件。
(3)readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
(4)len()获得列表中的元素个数。
(5)zeros(shape, dtype=float, order='C'),返回来一个给定形状和类型的用0填充的数组;
参数:shape:形状
dtype:数据类型,可选参数,默认numpy.float64
dtype类型:t ,位域,如t4代表4位
b,布尔值,true or false
i,整数,如i8(64位)
u,无符号整数,u8(64位)
f,浮点数,f8(64位)
c,浮点负数,
o,对象,
s,a,字符串,s24
u,unicode,u24
order:可选参数,c代表与c语言类似,行优先;F代表列优先
(6)strip() 方法用于移除字符串头尾指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' ')。
(7)split()就是将一个字符串分裂成多个字符串组成的列表。
3.2 准备数据:归一化数值
不同的属性,其数值的取值范围不同,则计算距离时属性的权重就会无法掌控。因此,通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。其通用公式:
newValue = (oldValue-min) /(max-min)
其中min和max分别是数据集中的最小特征值和最大特征值。
代码实现:
1 def autoNorm(dataSet): 2 minVals = dataSet.min(0) 3 maxVals = dataSet.max(0) 4 ranges = maxVals - minVals 5 normDataSet = zeros(shape(dataSet)) 6 m = dataSet.shape[0] 7 normDataSet = dataSet - tile(minVals, (m,1)) 8 normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide 9 return normDataSet, ranges, minVals
3.3 测试算法:作为完整程序验证分类器
通常把已有的数据90%作为训练样本分类器,其余10%数据去测试分类器,检验分类器的正确率。
代码实现:
1 def datingClassTest(): 2 hoRatio = 0.10 #hold out 10% 3 datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file 4 normMat, ranges, minVals = autoNorm(datingDataMat) 5 m = normMat.shape[0] 6 numTestVecs = int(m*hoRatio) 7 errorCount = 0.0 8 for i in range(numTestVecs): 9 classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) 10 print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) 11 if (classifierResult != datingLabels[i]): errorCount += 1.0 12 print "the total error rate is: %f" % (errorCount/float(numTestVecs)) 13 print errorCount
测试结果:
误差在5%,基本可以实现对结果的预测。
4.使用算法:构建完整可用系统
代码实现:
1 def classifierPerson(): 2 resultList = [u'不喜欢',u'比较喜欢',u'很喜欢'] 3 percentTats = float(raw_input(u"玩视频游戏所耗时间百分百:")) 4 ffmiles = float(raw_input(u"每年获得的飞行常客里程数:")) 5 iceCream = float(raw_input(u"每周消耗的冰淇淋公升数:")) 6 datingDataMat, datingLables = kNN.file2matrix('datingTestSet2.txt') 7 normMat,ranges,minVals = kNN.autoNorm(datingDataMat ) 8 inArr = array([ffmiles ,percentTats ,iceCream ]) 9 classifierResult = kNN.classify0((inArr-minVals )/ranges,normMat ,datingLables ,3) 10 print u"你对这个人喜欢度: %s" % resultList [classifierResult -1]
运行结果:
5 附-对数据分析的数据可视化
代码实现:
1 def show_data(): 2 dataSet,lables = kNN .file2matrix('datingTestSet2.txt') 3 jieguo = kNN .classify0([2674,8.54,8.0],dataSet ,lables ,10) 4 fig= plt.figure() 5 ax = fig.add_subplot(111) 6 ax.scatter(dataSet [:, 1], dataSet [:, 2], 7 15.0*array(lables ),15.0*array(lables)) 8 fig.show() 9 raw_input()
运行结果:
转载于:https://www.cnblogs.com/pursued-deer/p/7732783.html
机器学习之K-近邻算法相关推荐
- 机器学习:k近邻算法(KNN)介绍
k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...
- 机器学习之K近邻算法原理+应用实例
1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...
- 机器学习:K近邻算法
一.K-近邻算法简介 1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 1.1 K-近邻算法(KNN)概念 K Nearest Neighbor算法又叫KNN算法,这个算法 ...
- 机器学习:K近邻算法(K-NN)
K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...
- 机器学习之k近邻算法
本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...
- 【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现
文章目录 一.KNN 基本介绍 二.KNN 核心思想 三.KNN 算法流程 四.KNN 优缺点 五.Java 代码实现 KNN 六.KNN 改进策略 一.KNN 基本介绍 邻近算法,或者说K最邻近(K ...
- python机器学习---1. K近邻算法
机器学习的方法是基于数据产生的"模型" (model) 的算法,也称"学习算法" (learning algorithm).包括有监督学习(supervised ...
- 机器学习--从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
引言 最近在面试中,除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全不代表你将来的面试中会遇到此类问题,只是因为我的简历上 ...
- 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别
文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...
- k近邻算法_【机器学习】K近邻算法(KNN)
点击关注上方"小田学python",获取更多精彩内容 机器学习是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的 ...
最新文章
- 在linux(centos7)下本地仓库的搭建
- python中turtle画酷炫图案-用python打造可视化爬虫监控系统,酷炫的图形化界面
- Libvirsh 问题:GLib-WARNING **: gmem.c:483: custom memory allocation vtable not supported
- 在家办公效率最高的组合!
- SAP云平台CloudFoundry上部署了一个应用的技术明细
- 配置管理-SVN使用指南-Linux
- Oracle 建立序列以及触发器的建立
- alm数据库mysql_mysql
- Mybatis环境部署
- 方维分享系统修改,本地安装失败,后台无法登陆
- 【回归预测】基于matlab GA优化BP回归预测(含优化前的对比)【含Matlab源码 1790期】
- 利用矩阵的逆(伪逆)与除法求解
- C#使用iTextSharp打印PDF
- 电子商务购物网站的设计与实现(论文+源码)_kaic
- [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
- Java程序的基本结构
- HBuilder的下载与使用(详细步骤)
- Python 获取 网易云音乐热门评论(python2/python3代码)
- App Store Connect 上构建的新版本上传后找不到,二进制文件无效
- The request client is not a secure context and the resource is in more-private address space `privat
热门文章
- VC2010 编译 Media Player Classic - Home Cinema (mpc-hc)
- 计算机网络与计算机网络连接怎么办,电脑网络连接不上怎么办【是什么原因】...
- array in java,ArrayList to Array Conversion in Java
- windows下DOS命令杀掉Nginx应用进程
- 根据一张表更新另一张表
- Mybatis Mapper自动注入警告的解决方案
- 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列
- 【NOIP2014】【Luogu2141】珠心算测验(枚举,合并两数组相同元素个数)
- JavaScript文档对象模型DOM节点操作之兄弟节点(4)
- SQL Server高级查询之常见数据库对象(触发器)第五章节