KNN算法

最邻近规则分类(K-Nearest Neighbor)

1. 综述

  • Cover和Hart在1968年提出了最初的邻近算法

  • 分类(classification)算法

  • 输入基于实例的学习(instance-based learning), 懒惰学习(lazy learning)

2. 算法详述

2.1 步骤:

  • 为了判断未知实例的类别,以所有已知类别的实例作为参照

  • 选择参数K,对任意一个未知实例选取最近的K个已知实例进行归类,通常K的值不会太大,选取1,3,5,7等等的奇数

  • 计算未知实例与所有已知实例的距离

  • 选择最近K个已知实例

  • 根据少数服从多数的投票法则(majority-voting),让未知实例归类为K个最邻近样本中最多数的类别

3.2 细节:

3.21 关于K

  • 根据实践来进行规划

3.2.2 关于距离的衡量方法:

  • 欧氏距离( Euclidean distance)也称欧几里得距离



  • 其他距离衡量:
    余弦值(cos), 相关度 (correlation), 曼哈顿距离 (Manhattan distance)

4 举例

问题:估计未知电影属于什么类型?

4.1 步骤一:

建立平面坐标,将7部电影转化为7个坐标,X坐标,X坐标 及类型如如下图所示,通过A~F点,估计G点的类型。

4.2 步骤二:计算距离

计算代码如下:

import math

def ComputeEuclideanDistance(x1,y1,x2,y2):
    d = math.sqrt(math.pow((x1-x2),2)+math.pow((y1-y2),2))
    return d

d_ag = ComputeEuclideanDistance(3,104,18,90)
d_bg = ComputeEuclideanDistance(2,100,18,90)
d_cg = ComputeEuclideanDistance(1,81,18,90)
d_dg = ComputeEuclideanDistance(101,10,18,90)
d_eg = ComputeEuclideanDistance(99,5,18,90)
d_fg = ComputeEuclideanDistance(98,2,18,90)
print("d_ag:",d_ag)
print("d_bg:",d_bg)
print("d_cg:",d_cg)
print("d_dg:",d_dg)
print("d_eg:",d_eg)
print("d_fg:",d_fg)

输出结果为:

d_ag: 20.518284528683193
d_bg: 18.867962264113206
d_cg: 19.235384061671343
d_dg: 115.27792503337315
d_eg: 117.41379816699569
d_fg: 118.92854997854805

4.3 步骤三:估计

比较以上的计算出的6个欧氏距离,选取最近的3个距离对应的点A,B,C三个点,由于这三个点都属于Romance类型,则未知数据G点根据最近邻规则分类(KNN)也属于Romance类型。
若选取的点中两个类型都存在,则遵从少数服从多数的原则,选取类别数目多的作为未知点的类别。

5. 算法优缺点:

上图有两个不同类别的点分别为红色和蓝色,绿色的点为新的实例,问这个点的归类?

假设取K=1,只看距离绿色最近的一个点,应该和蓝色分类到一起;假设K=4,包含3个红色与1个蓝色,根据少数服从多数原则,应该归类为红色;假设K=9,应该归类为红色。

所以KNN算法对于K的选择非诚敏感,K=1时,不能够防止噪音,通常会增大K,以增加对噪音的健壮性

5.1 算法优点

  • 简单

  • 易于理解

  • 容易实现

  • 通过对K的选择可具备丢噪音数据的健壮性

5.2 算法缺点

  • 需要大量空间储存所有已知实例

  • 算法复杂度高(需要比较所有已知实例与要分类的实例)

  • 当其样本分布不平衡时,比如其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并木接近目标样本

6. 算法改进

考虑距离,根据距离加上权重
比如: 1/d (d: 距离)





            【注】:本文为麦子学院机器学习课程的学习笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 之前讲解的线性回归和逻辑回归的原理中,不免会引入大量的数学推导和证明过程,从预测函数的建立,到损失函数的偏导数求解...
    PrivateEye_zzy阅读 18,668评论 0 7
  • kNN算法原理 1、K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也...
    雨一流阅读 24,855评论 0 8
  • 一、算法介绍 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最...
    TangCC阅读 3,161评论 0 4
  • KNN算法 用NumPy库实现K-nearest neighbors回归或分类。 邻近算法,或者说K最近邻(kNN...
    心智万花筒阅读 16,032评论 1 24
  • K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便...
    严国华阅读 747评论 0 0