机器学习算法:k近邻(kNN)算法

k近邻算法(k-nearest neighbor, kNN)是一种基本分类方法。k近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。分类时,对于新的实例(如下图的绿色方框),根据其k个最近的训练实例的类别,通过多数表决等方式进行预测。具体分类过程如下图所示。

k近邻算法分类示意图

从上图可以看出,kNN不具有显式的学习过程,实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。距离度量、k值选择分类决策规则是k近邻法的3个基本要素。

1、距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映。k近邻模型的特征空间一般是n维实数向量空间R^n 。可以使用的距离度量可定义为:

L_{a} (x_{i},x_{j})=(\sum_{l=1}^n\vert x_{i}^l - x_{j}^l\vert ^p )^\frac{1}{p}  ,其中p\geq 1

p=2时,称为欧氏距离(Euclidean distance);

p=1时,称为曼哈顿距离(Manhattan distance);

p为无穷大时,它是各个坐标距离的最大值。

2、k值的选择

k值的选择会对k近邻算法的结果产生重大影响。例如:

k=3时,新实例(如上图中绿色方框)判定为蓝色三角形类;当k=5时,新实例判定为红色圆圈类。

k值越小就意味着整体模型变得复杂,容易发生过拟合。

k值越大就意味着整体模型变得简单,预测容易发生错误。

在应用中,k值一般取一个较小的数值,通常采用交叉验证法来选取最优的k值。如下图所示,当增大k时,一般错误率会先降低,因为有周围更多的样本可以借鉴了,分类效果会变好。当k增大到一定程度使,分类模型变得越来越简单,错误率会更高。

3、分类决策规则

k近邻算法中的分类决策规则往往是多数表决,即由k个邻近的训练实例中的多数类决定新实例的类别。多数表决规则等价于经验风险最小化。

4、优缺点分析

优点:1)简单易用,相比其他算法,KNN算法简洁明了;2)模型训练时间快;3)预测效果好;4)对异常值不敏感。

缺点:1)需存储所有训练数据,对内存要求较高;2)预测阶段可能很慢;3)对不相关的功能和数据规模敏感。

5、算法实现

实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。这点在特征空间的维数大及训练数据容量大时尤其必要。

k近邻算法最简单的实现方法是线性扫描(linear scan)。这时要计算新实例与每个训练实例的距离。当训练集很大时,计算非常耗时,这种方法是不可行的。

为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法很多,kd树方法是其中一种。

首先,对所有训练数据构造kd树。即是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。

其次,利用kd树进行k近邻搜索。利用kd树可以省去大部分数据点的搜索,从而减少搜索的计算量。

6、sklearn库中kNN实践

1)kNN函数介绍

首先,介绍sklearn库中kNN算法的一些参数:

def KNeighborsClassifier(n_neighbors =5,  weights='uniform', algorithm ='', leaf_size ='30', p =2, metric ='minkowski', metric_params = None, n_jobs = None )

其中,

n_neighbors:这个值就是指 kNN 中的 k

weights:最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:

        • 'uniform':不管远近权重都一样,就是最普通的 KNN 算法的形式。

        • 'distance':权重和距离成反比,距离预测目标越近具有越高的权重。

        • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。

algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式。一是暴力法,就是直接计算距离存储比较的那种放松。二是kd 树构建 KNN 模型三是使用球树构建。其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:

        • 'brute' :蛮力实现

        • 'kd_tree':KD 树实现 KNN

        • 'ball_tree':球树实现 KNN

        • 'auto': 默认参数,自动选择合适的方法构建模型

不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 'brute'

leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。

p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。

metric:指定距离度量方法,一般都是使用欧式距离。

        • 'euclidean' :欧式距离

        • 'manhattan':曼哈顿距离

        • 'chebyshev':切比雪夫距离

        • 'minkowski': 闵可夫斯基距离,默认参数

n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

2)代码实例

以sklearn官方给出的例子,给出代码实例如下:

from sklearn.datasets import load_iris

from sklearn.model_selection import cross_val_score

import matplotlib.pyplot as pltfrom sklearn.neighbors 

import KNeighborsClassifier

#读取鸢尾花数据集

iris = load_iris()

x = iris.data

y = iris.target

k_range = range(1, 31)

k_error = []

#循环,取k=1到k=31,查看误差效果

for k in k_range:

    knn = KNeighborsClassifier(n_neighbors=k)

    #cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集

    scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')

    k_error.append(1 - scores.mean())

#画图,x轴为k值,y值为误差值

plt.plot(k_range, k_error)

plt.xlabel('Value of K for KNN')

plt.ylabel('Error')

plt.show()

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

推荐阅读更多精彩内容