基于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的更多相关文章

  1. [机器学习] ——KNN K-最邻近算法

    KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  2. 机器学习——kNN(1)基本原理

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  3. 机器学习--kNN算法识别手写字母

    本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...

  4. 机器学习-KNN算法详解与实战

    最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...

  5. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  6. 机器学习 KNN算法原理

    K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...

  7. 机器学习-KNN分类器

    1.  K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2.  KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...

  8. ML02: 机器学习KNN 算法

    摘要: 一张图说清楚KNN算法 看下图,清楚了吗?   没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...

  9. 机器学习——kNN(2)示例:改进约会网站的配对效果

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. MySql 性能调优策略

    本主题调优针对于my.cnf配置来做详细的参数说明 示例配置如下: #cat my.cnf # MySQL client library initialization. [client] port = ...

  2. 阿里云服务器 无法连接svn

    网上所说的在服务器中:1. 配置防火墙 2.svnserve.conf没配置好,3.svn客户端缓存,都进行排查处理,还是连接不上. 最后使用ip add 查看服务器网卡ip命令 发现无法看到当前服务 ...

  3. [UWP]做个调皮的BusyIndicator

    1. 前言 最近突然想要个BusyIndicator.做过WPF开发的程序员对BusyIndicator应该不陌生,Extended WPF Toolkit 提供了BusyIndicator的开源实现 ...

  4. @Scope注解

    @Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)这个是说在每次注入的时候回自动创建一个新的bean实例 @Scope(value=Config ...

  5. 老男孩Python全栈开发(92天全)视频教程 自学笔记19

    day19 课程内容: 第19天的课程就是复习一些正则表达式,以及说一下计算器的思路,我就把我做的计算器代码当这一天的内容吧. 计算器作业:不eval函数,计算能计算:'1-2*((60-30-8*( ...

  6. Android动态改变App在Launcher里面的icon

    如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...

  7. android技术晋升之道

    写一篇文章记录一下我看到的几个特别常见的误区,希望对团队晋升的同学能有帮助. 误区1:把特质当成案例 工作非常努力,连续一个月加班到12点,解决了问题 喜欢学习新技术和分享,团队同学都很喜欢 善于钻研 ...

  8. mysql常用基础操作语法(十)~~子查询【命令行模式】

    mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...

  9. 笔记︱支持向量机SVM在金融风险欺诈中应用简述

    本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 欺诈一般不用什么深入的模型进行拟合,比较看重分析员对业务的了解,从异常 ...

  10. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...