算法

假定数据有M个特征,则这些数据相当于在M维空间内的点

\[X = \begin{pmatrix}
x_{11} & x_{12} & ... & x_{1M} \\
x_{21} & x_{22} & ... & x_{2M} \\
. & . & & .\\
. & . & & .\\
. & . & & .\\
x_{N1} & x_{N2} & ... & x_{NM}
\end{pmatrix}\]

同时我们有标注集向量

\[\vec{y} = \begin{pmatrix}
y_1 \\
y_2 \\
. \\
. \\
. \\
y_M
\end{pmatrix}\]

那么对于一个新的数据点

\[\vec{x_z} = \begin{pmatrix}
x_{z1} & x_{z2} & ... & x_{zM}
\end{pmatrix}\]

我们通过计算其与其他所有点的欧氏距离

\[D_j=\sqrt{(x_{z1}-x_{j1})^2+(x_{z2}-x_{j2})^2+...+(x_{zM}-x_{jM})^2}
\]

得到与所有点的距离向量(并按从小到大排序)

\[\vec{D} = \begin{pmatrix}
D_1 \\
D_2 \\
. \\
. \\
. \\
D_M
\end{pmatrix}\]

取前k个点即为最近邻的k个点。

\[\vec{D_k} = \begin{pmatrix}
D_1 \\
D_2 \\
. \\
. \\
. \\
D_k
\end{pmatrix}\]

根据这k个点所对应的标注,统计这些标注出现的次数\(n_k\)

\[\vec{y'}=\begin{pmatrix}
y_1 & n_1 \\
y_2 & n_2 \\
. & .\\
. & .\\
. & .\\
y_k & n_k
\end{pmatrix}\]

取数量最大的标注作为\(\vec{x_z}\)的标注。

\[y_z = \max_n{\vec{y'}}
\]

算法实现(Python)

from numpy import *

def KNNclassify(inX, dataset, labels, k):
"""
K-Nearest Neighbour algorithm
:param inX: Input vector X
:param dataset: Training Dataset
:param labels: Labels vector
:param k: the number of nearest neighbours
:return: The class of input
"""
dataset_size = dataset.shape[0]
diffMat = tile(inX, (dataset_size, 1)) - dataset # Use inX to fill a matrix of dataset_size
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) # Sum according to rows of matrix
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort() # Get the index of all distances
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

算法优点

  1. 算法实现简单;
  2. 不需要事先训练,可直接应用于数据。

算法缺点

  1. 数据条目很多时算法消耗时间很长,因为它要计算新数据点到每个已存在的数据点的距离;
  2. 可能会出现多个相同的最大值,导致新的数据点无法准确判断真实的类别标注;
  3. 如果直接使用KNN算法,则数据范围大的特征对结果影响很大。为了消除这种影响,应该对数据进行归一化的预处理。

机器学习学习笔记之一:K最近邻算法(KNN)的更多相关文章

  1. 机器学习【一】K最近邻算法

    K最近邻算法 KNN 基本原理 离哪个类近,就属于该类   [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...

  2. 转载: scikit-learn学习之K最近邻算法(KNN)

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  3. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  4. k最近邻算法(kNN)

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  5. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  6. PCB 加投率计算实现基本原理--K最近邻算法(KNN)

    PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...

  7. 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)

    K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集

    机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...

  9. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

  10. [笔记]《算法图解》第十章 K最近邻算法

    K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...

随机推荐

  1. PHP 笔记——String 字符串

    1. 定义 单引号括起来的字符串被原样输出. 双引号字符串中的变量被PHP解析为变量值. 2. 获取字符串长度 strlen(string $string): int 在utf-8下,汉字占3个字符, ...

  2. [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655

    待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写

  3. 【DLX算法】hdu3498 whosyourdaddy

    题意:给你一个01矩阵,让你选择尽可能少的行数,使得这些行的并集能够覆盖到所有列. DLX算法求解重复覆盖问题模板,使用估价函数进行剪枝. #include<cstdio> #includ ...

  4. 三周学会小程序第四讲:Heroku 绑定 Github 自动部署

    这一讲是根据读者的反馈补充的一个讲解,好多读者反应安装 Heroku-cli 遇到问题,或者是操作繁琐,其实上一讲中提到的 Heroku 只是为了免费部署,而安装 Heroku-CLI只是为了部署,所 ...

  5. CountDownLatch源码分析

    CountDownLatch.Semaphore(信号量)和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer共享排队的 ...

  6. 如何在Ubuntu中用firefox浏览器查看chm文档?

    首先下载这插 件:在firefox中点击“工具”->“附加软件”->“扩展”,在firefix扩展网页下搜索“"chmfox" 然后安装,重启后就可以了.

  7. ExtJS表格——行号、复选框、选择模型

    本篇的内容是为表格添加行号,和复选框,最后谈一下Ext的选择模型.内容比较简单,就直接上代码了.一. 设置行号   行号的设置主要问题在于删除某一行后需要重新计算行号  Ext.onReady(fun ...

  8. 复制到剪切板js代码(转)

    <script type="text/javascript" language="javascript"> //复制到剪切板js代码 functio ...

  9. Circuit provides reference for multiple ADCs

    The achievable accuracy for systems with multiple ADCs depends directly on the reference voltages ap ...

  10. Windows下配置Git服务器和客户端

    http://www.cnblogs.com/lwme/archive/2012/12/25/configuring-git-server-and-client-on-windows.html] 选择 ...