关闭

机器学习之k近邻

标签: 机器学习k近邻knn聚类
1016人阅读 评论(0) 收藏 举报
分类:

核心思想

KNN算法假设给定的训练集中的实例都已经分好类了,对于新的实例,根据离它最近的k个训练实例的类别来预测它的类别。即这k个实例大多数属于某个类别则该实例就属于某个类别。比如k为5,离新实例a最近的5个样本的情况为,3个样本属于A类,1个样本属于B类,一个样本属于C类,那么新实例a属于A类。

这里写图片描述

常用距离

  • 欧氏距离
    d(x,y)=ni=1(xiyi)2
  • 曼哈顿距离
    d(x,y)=ni=1|(xiyi)|
  • 切比雪夫距离
    d(x,y)=max(|xiyi|)

这里写图片描述

k值的影响

k值的选取可能会影响到分类结果,如下图,k=3和k=5时的分类结果是不同的。

这里写图片描述

  1. k值小可能会导致预测结果对近邻的样本点敏感,如果刚好是噪音则会导致预测结果出错,容易发生过拟合。近似误差小,估计误差大。
  2. k值大可能会导致较远的样本也影响预测,也可能会导致预测错误。近似误差大,估计误差小。
  3. k值一般先取较小的数,再用交叉验证方法选择最优k值。

算法实现

两种方式:线性扫描和kd树。

线性扫描

KNN的最简单朴素的方法即直接线性扫描,大致步骤如下:
1. 计算待预测数据与各训练样本之间的距离;
2. 按照距离递增排序;
3. 选择距离最小的k个点;
4. 计算这k个点类别的频率,最高的即为待预测数据的类别。

代码实现

from numpy import *
import pylab as pl

dataSet = array([[11, 12], [12, 12], [11, 11], [11, 16], [12, 16], [17, 11], [17, 12]])
classes = ['A', 'A', 'A', 'B', 'B', 'C', 'C']
k = 3
dot = [13, 13]
type
r = 0
dataSize = dataSet.shape[0]
diff = tile(dot, (dataSize, 1)) - dataSet
sqdiff = diff ** 2
squareDist = sum(sqdiff, axis=1)
dist = squareDist ** 0.5
sortedDistIndex = argsort(dist)
classCount = {}
for i in range(k):
    label = classes[sortedDistIndex[i]]
    classCount[label] = classCount.get(label,0) + 1
    if dist[i] > r:
        r = dist[i]
maxCount = 0
for key, value in classCount.items():
    if value > maxCount:
        maxCount = value
        type = key
pl.plot(dot[0], dot[1], 'ok')
circle = [i*pi/180 for i in range(0,360)]
x = cos(circle)*r+dot[0]
y = sin(circle)*r+dot[1]
pl.plot(x, y, 'r')
pl.plot([point[0] for point in dataSet[0:3]], [point[1] for point in dataSet[0:3]], 'og')
pl.plot([point[0] for point in dataSet[3:5]], [point[1] for point in dataSet[3:5]], 'or')
pl.plot([point[0] for point in dataSet[5:7]], [point[1] for point in dataSet[5:7]], 'oy')
pl.show()

这里写图片描述

kd树

线性扫描非常耗时,为了减少计算距离的次数提高效率,使用kd树方法,它能快速地找到查询点近邻。

可以通过将搜索空间进行层次划分建立索引树以加快检索速度。

对于二维空间,它最终要划分的空间类似如下,

这里写图片描述

决定在哪个维度上进行分割是由所有数据在各个维度的方差决定的,方差越大说明该维度上的数据波动越大,更应该再该维度上对点进行划分。例如x维度方差较大,所以以x维度方向划分。

分割时一般取分割维度上的所有值的中值的点,比如下图,第一次计算方差较大的维度为x维度,中值点为A,以x=Ax分割,接着对分割后的点分别又继续分割,计算方差并寻找中值,以y=Cy、y=By分割,以此类推。

这里写图片描述

kd树查找

从根节点开始查找,直到叶子节点,整个过程将最短距离d和相应的点记录下来。

回溯,通过计算待预测的点到分割平面的距离l与最短距离d比较,看是否要进入节点的相邻空间去查找。回溯的过程是为了确认是否有必要进入相邻子空间去搜索,当待预测点到最近点的距离d大于待预测点到分割面的距离l时,则需要到相邻子空间查找,否则则没必要,直接往上一层回溯。

========广告时间========

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================
欢迎关注:

这里写图片描述

1
0
查看评论

机器学习-----K近邻算法

下午参加了个交流会,主要介绍了一下K近邻算法。这里把我的理解总结一下。 K临近算法就是,样本中的数据有多个维度,每条样本对应一个标签。对要判断的数据,跟样本中的数据求出距离,然后递增排序,去前K个距离近的样本,对应标签比例大的那个就是,要判断的数据对应的标签。 这个算法的思想还是挺好理解的,但是...
  • smile0198
  • smile0198
  • 2013-12-22 23:39
  • 1058

机器学习实战--k近邻算法(续)

接续上次的k近邻算法,上一篇博文地址,这里用一个新的实例进行算法的验证。 一个手写数字识别系统,为了处理方便,书中已经将样本训练好,并转化为txt格式方便后续处理。具体格式如下: 这是0的其中一种表示方式。     我们的目标是输入一个类似的数字,系统能够识别出来即可。 ———...
  • insthink
  • insthink
  • 2016-05-17 15:00
  • 190

机器学习(1)k最近邻算法、朴素贝叶斯算法、聚类算法、

k最近邻算法 1. 原理 数据映射到高维空间中的点找出k个最近的样本投票结构 2.如何衡量距离 数学中距离满足三个要求 必须为正数必须对称满足三角不等式 3.闵可夫斯基距离(Minkowski): 汉哈顿距离欧氏距离切比雪夫距离 公式: ...
  • Wayne12081213
  • Wayne12081213
  • 2018-01-06 16:43
  • 43

机器学习实战之K近邻

from numpy import * import operator from cProfile import label import matplotlib import matplotlib.pyplot as plt from os import listdir def createDat...
  • li385805776
  • li385805776
  • 2013-06-27 16:55
  • 3007

《机器学习实战》学习笔记:k-近邻算法实现

机器学习:k-近邻(kNN)算法的基本原理与Python实现
  • liyuefeilong
  • liyuefeilong
  • 2015-08-30 00:10
  • 3506

机器学习之KNN(K近邻)

简介 k近邻法(K-NN)是一种基本的分类与回归方法。分类时,对新的实例,根据k个最近邻的训练实例的类别,通过多数表决等方式进行预测。k近邻的三要素:k值的选择、距离度量以及分类决策规则。k近邻算法简单、直观,给定一个训练数据集,对于输入的实例,在训练数据集中找到与该实例最近邻的k个实例,这k个实...
  • zhang20072844
  • zhang20072844
  • 2016-06-18 09:03
  • 682

机器学习之K近邻简介

描述KNN是常见的监督学习算法,输入是实例的特征向量,输出是实例对应的类别。 给定测试样本,基于某种距离计算方法,计算出与其距离最近的K个训练样本,根据多数表决方法判定属于哪个类别。典型的懒惰学习算法,不具有显示的学习过程。在接受数据时,不做处理,当真正计算的时候才按照算法流程走。 三大要素: ...
  • u011283591
  • u011283591
  • 2017-04-26 12:48
  • 96

机器学习之K近邻

K近邻算法在机器学习算法中是最容易理解并且是最容易使用的算法,下面是机器学习实战中对K近邻算法的注释。''' Created on Sep 16, 2010 kNN: k Nearest NeighborsInput: inX: vector to compare ...
  • u011058765
  • u011058765
  • 2016-04-23 15:18
  • 423

机器学习笔记--K-近邻算法(一)

机器学习实战这本书的例子很多也很好,问题导向型的,所以例子也是循序渐进。如果真要读懂,一遍是不够的,特别是我这种渣。其实写机器学习实战笔记的同时,我都或多或少的参考了《机器学习与R语言》这本书,相互借鉴,看看同样的问题表述,两者有什么区别。 1. K-近邻算法的概述 简单地说,K-近邻算法采用测量...
  • ggwcr
  • ggwcr
  • 2017-08-10 13:25
  • 356

【机器学习实战】笔记1-K近邻算法

机器学习实战之k近邻算法代码分析
  • whu_paprika
  • whu_paprika
  • 2016-12-29 07:55
  • 636
    作者
    https://github.com/sea-boat

    公众号:(内容包括分布式、机器学习、深度学习、NLP、Java深度、Java并发核心、JDK源码、Tomcat内核等等)



    微信:

    打赏作者

    如果您觉得作者写的文章有帮助到您,您可以打赏作者一瓶汽水(*^__^*)

    个人资料
    • 访问:1060659次
    • 积分:14058
    • 等级:
    • 排名:第1049名
    • 原创:326篇
    • 转载:5篇
    • 译文:1篇
    • 评论:348条
    博客专栏
    最新评论