机器学习-kNN
基于Peter Harrington所著《Machine Learning in Action》
kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习、数据挖掘的入门实例是非常合适的。
简单的解释一下kNN的原理和目的:
假设有一种数据,每一条有两个特征值,这些数据总共有两大类,例如:
[ [1 , 1.1] , [ 1 , 1 ] , [0 , 0 ] , [0 , 0.1] ] 这四个数据(训练数据),种类分别为[ 'A' , 'A' , 'B' ,'B' ]。
现在给出一条数据X=[1.1 , 1.1],需要判断这条数据属于A还是B,这时候就可以用kNN来判断。当然现实中每个数据可能有很多个特征,总共也有很多分类,这里以最简单的方式来举例。
原理也非常简单,将上述训练数据放到坐标轴中,然后计算X到每个训练数据的距离,从近到远做个排序,选取其中的前N条,判断其中是属于A类的数据多还是B类的多,如果属于A类的多,那可以认为X属于A;反之亦然。
下面就用具体的代码来演示一下上面陈述的算法。(基于py,建议直接装anaconda,一劳永逸)
建立一个py文件,名称随意。
先是创建训练数据,这里用py数组代替,实际可能是一堆文本或其他格式
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables=['A','A','B','B']
return group,lables
group是训练数据,lables是group的分类数据。
kNN算法
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]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
inX就是需要判断的数据X,dataSet就是上面构建出来的group,labels是group的分类,k是“从近到远做个排序,选取其中的前N条”中的N,这个会对结果的准确性有一定影响。
这里用以下测试数据结合kNN算法进行讲解。
group,labels = createDataSet()
inX= [1.1,1.10]
print(classify0(inX,group,labels,3))
第2行是计算dataSet的总行数,此时为4。下面3,4,5,6行就是计算inX到每个训练数据的距离的,用的是欧式距离公式0ρ = sqrt( (x1-x2)^2+(y1-y2)^2 ),高中都学过。只是用矩阵和python的形式写出来可能一时不好看明白。
3 tile(inX,(dataSetSize,1)) 构建出一个每一行都是inX,有dateSetSize行的矩阵,具体数据如下:
[[ 1.1 ,1.1]
[ 1.1 ,1.1]
[ 1.1 ,1.1]
[ 1.1 ,1.1]]
再用这个矩阵减去dataSet,则会得到inX和每个训练数据的x,y坐标上的差值。最终的diffMat如下,这就是inX对每个训练数据的 x1-x2,y1-y2:
[[ 0.1 ,0. ]
[ 0.1 ,0.1]
[ 1.1 ,1.1]
[ 1.1 ,1. ]]
4就是对矩阵做个平方,得到结果如下,即(x1-x2)^2,(y1-y2)^2:
[[ 0.01 ,0. ]
[ 0.01 ,0.01]
[ 1.21 ,1.21]
[ 1.21 ,1. ]]
5就是把矩阵横向相加,得到结果就是(x1-x2)^2+(y1-y2)^2:
[ 0.01 ,0.02 , 2.42, 2.21]
6就是对5得到的(x1-x2)^2+(y1-y2)^2进行开根号,得到inX到每个训练数据的距离,结果如下:
[ 0.1 , 0.14142136 , 1.55563492 , 1.48660687]
7是对6做个排序,9-11就是选出和inX距离最近的前k个点,统计这k个点中有几个属于A,有几个属于B。在本例中,得到的sortedClassCount为:
[('A', 2), ('B', 1)]
也就是和inX最近的三个点有两个属于A,一个B。这是,就可以认为inX是属于A类的了。
机器学习-kNN的更多相关文章
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- 机器学习-KNN算法详解与实战
最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习 KNN算法原理
K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...
- 机器学习-KNN分类器
1. K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2. KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...
- ML02: 机器学习KNN 算法
摘要: 一张图说清楚KNN算法 看下图,清楚了吗? 没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...
- 机器学习——kNN(2)示例:改进约会网站的配对效果
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
随机推荐
- 安装php的memcached模块和扩展支持sasl
memcached的1.2.4及以上增加了CAS(Check and Set)协议,对于同一key的多进行程的并发处理问题.这种情况其实根数据库很像,如果同时有几个进程对同一个表的同一数据进行更新的话 ...
- 一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库
好久没有研究Power BI了,看到高飞大神弄的东西,太惭愧了.今天有个小东西,数据在Sqlite里面,想倒腾到Power BI Desktop里面折腾一下,结果发现还不直接支持.所以只好硬着头皮上去 ...
- WinFom中经典小游戏(含源码)
最近整理了若干经典的小游戏,无聊时可以打发时间.程序本身不大,练手非常不错,主要是GDI编程,主界面地址如下图所示 源码下载方式 1,关注微信公众号:小特工作室(也可直接扫描签名处二维码) 2,发送: ...
- aria2 加速百度网盘下载
准备工作: chrome浏览器: BaiduExporter插件(下载地址:https://github.com/acgotaku/BaiduExporter): aria2工具(下载地址:http: ...
- javascript 函数详解
一.函数的一些基础概念: 1.js中的函数使用function来声明. 2.关于return: 2.1 函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行: 2. ...
- 理解Activity.runOnUiThread()
这是一篇译文(中英对照),原文链接:Understanding Activity.runOnUiThread() When developing Android applications we alw ...
- window 环境变量保存位置在哪里?
注册表-regedit.exe 用户变量: HKEY_CURRENT_USER\Environment 系统变量: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...
- php程序员的成长之路
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的php开发:能够在PHP中型系统中支 ...
- Java线程和守护进程
ava的线程机制,有两类线程:User Thread(用户线程).Daemon Thread(守护线程) . 操作系统里面是没有守护线程的概念,只有守护进程,但是Java语言机制是构建在JVM的基础之 ...
- Java中的Lock与synchronized
并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...