基于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. 脚本启用python虚拟环境

    #!/bin/bash rm -rf /data/website/activities/virtualenvvirtualenv --no-site-packages -p python3 /data ...

  2. 配置可以通过http协议访问的svn服务器

    通过HTTP协议访问版本库是Subversion的亮点之一,这种方式具备许多svnserve服务器所没有的特性,使用上更加灵活. 关于mode_day_svn模块: 由于Subversion需要版本化 ...

  3. Kubeadm 安装部署 Kubernetes 集群

    阅读目录: 准备工作 部署 Master 管理节点 部署 Minion 工作节点 部署 Hello World 应用 安装 Dashboard 插件 安装 Heapster 插件 后记 相关文章:Ku ...

  4. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  5. Windows Server 2016-图形化备份域控制器

    上边几章节我们补充了有关Windows Server 2016系统层面的相关内容,本章切回Active Directory正题,继续围绕AD域相关内容进行不断梳理补充.Windows Server B ...

  6. ASP.NET Core 使用 URL Rewrite 中间件实现 HTTP 重定向到 HTTPS

    在传统 ASP.NET 程序中,我们可以通过配置 IIS 的“URL 重写”功能实现将 HTTP 请求重定向为 HTTPS .但是该方法在 ASP.NET Core 应用中不再工作.在 ASP.NET ...

  7. 1.3 fractions模块

    数学世界中,浮点数还可以用分数形式展示,不可约简的分数形式往往更简洁直观.  问题来了,Python中如何输出不可约简的分数形式呢?  答案:用Fraction类来实现.这个类属于标准库的fracti ...

  8. Java并发编程-线程可见性&线程封闭&指令重排序

    一.指令重排序 例子如下: public class Visibility1 { public static boolean ready; public static int number; } pu ...

  9. 剑指offer 第九天

    35.数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出 ...

  10. file_get_contents函数不能使用的解决方法

    今天开发微信公众平台的时候 使用file_get_contents 去获得token 结果一直返回false.百度了一下,大部分都是说用curl 偶然发现可能是openssl没有开启的问题,开启ope ...