11、K近邻算法(KNN)

1 KNN算法介绍

KNN算法又叫做K近邻算法(k-NearestNeighbor),是最简单的分类算法之一,同时,它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法,它看起来和Kmeans相似(Kmeans是无监督学习算法),但却是有本质区别的。

KNN算法基于实例之间的相似性进行分类或回归预测。在KNN算法中,要解决的问题是将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。其核心思想为:“近朱者赤,近墨者黑”

1.1 直观理解

K近邻法(k-NearestNeighbor)是一种很基本的机器学习方法,能做分类和回归任务

在这里插入图片描述

假设有训练集,请根据训练集训练一个KNN模型,预测最后一部影片的电影类型。

在这里插入图片描述

step1:将训练集中的所有样例画入坐标系,也将待测样例画入

在这里插入图片描述

step2:计算待测分类的电影与所有已知分类的电影的欧式距离

在这里插入图片描述

step3:将这些电影按照距离升序排序,取前 k k k个电影,假设 k = 3 k=3 k=3,那么我们得到的电影依次是《He’s Not Really Into Dudes》、《Beautiful Woman》和《California Man》。而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

1.2 KNN算法三大基本要素

kNN的三个基本要素:距离度量算法k值的确定决策规则

  1. 距离度量:一般使用的是欧氏距离。也可以使用其他距离:曼哈顿距离、切比雪夫距离、闵可夫斯基距离等。

  2. k k k值的确定 k k k值越小,模型整体变得越复杂,越容易过拟合。在应用中, k k k值一般取一个比较小的数值。通常使用交叉验证法来选取最优 k k k

    • 选择较大的 k k k值,模型会考虑过多的邻近点实例点,甚至会考虑到大量已经对预测结果没有影响的实例点,让预测出错;
    • 选择较小的 k k k值,相当于用较小邻域中的训练实例进行预测,会使模型变得敏感(如果邻近的实例点恰巧是噪声,预测就会出错)。
  3. 决策规则

    • 分类:一般是多数表决,即由输入实例的 k k k个邻近的训练实例中的多数类决定待测实例的类,或带权投票
    • 回归:取平均值,或带权取平均值

训练KNN模型需要进行特征标准化吗?

  • 需要,因为在距离度量的时候,如果不使用特征标准化,那么各样本点间的距离会相差较大,需要进行特征处理,让处理的临近点更贴切
  • 只要依赖权重和距离度量的算法需要进行特征处理

KNN是一种非参的,惰性的算法模型

  • 非参:并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归总会假设线性回归是一条直线。KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况。
  • 惰性:同样是分类算法,逻辑回归需要先对数据进行大量训练,最后会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

1.3 KNN模型的优缺点

(1)KNN算法具有以下优点

  • 简单易懂,能做分类和回归:KNN算法的基本思想直观简单,易于理解和实现。

  • 惰性学习,无需训练(蛮力法),KD树的话,则需要建树:KNN算法是一种基于实例的学习方法,不需要显式的训练过程,它直接利用已有的训练数据进行分类或回归预测。

  • 适用于多类别问题:KNN算法可以应用于多类别问题,不受类别数目的限制。

  • 对于不平衡数据集有效:KNN算法在处理不平衡数据集时相对较为有效,因为它不假设数据分布的先验知识。

(2)KNN算法的一些缺点

  • 计算复杂度高,速度慢:在进行分类或回归预测时,KNN算法需要计算待分类数据点与所有训练数据点之间的距离。当训练数据集较大时,计算复杂度会显著增加。

  • 对特征空间维度敏感:KNN算法对于特征空间的维度敏感。当特征空间维度较高时,由于所谓的"维度灾难",KNN算法的性能可能会下降。在高维数据中,距离度量变得不准确,所有数据点都变得离得很远,失去了近邻的意义。

  • 需要选择合适的K值:KNN算法的性能很大程度上取决于选择合适的最近邻数量K。选择过小的K值可能导致模型过于敏感,容易受到噪声的影响;选择过大的K值可能导致模型过于平滑,无法捕捉到细微的类别特征。

  • 不适用于大规模数据集:由于KNN算法需要在预测阶段计算待分类数据点与所有训练数据点的距离,因此对于大规模数据集来说,存储和计算的开销可能会非常大。

KNN算法是一种简单但强大的分类和回归方法,适用于多种问题领域。但在使用时需要注意计算复杂度、维度敏感性、合适的K值选择以及适应大规模数据集的挑战。

2 KNN算法实现

2.1 KNN算法流程

KNN算法流程总结如下:

  • 计算测试数据与各个训练数据之间的距离;
  • 按照距离的递增关系进行排序;
  • 选取距离最小的 k k k个点;
  • 确定前 k k k个点所在类别的出现频率;
  • 返回前 k k k个点中出现频率最高的类别作为测试数据的预测分类

2.2 实现方法

针对部分数据(特征空间维度大,数据容量大)为了提高KNN算法的性能,可以使用特征选择和降维技术来减少特征空间的维度,以及采用KD树等数据结构来加速最近邻搜索过程。

  • 蛮力法(brute-force)

    k k k近邻法最简单的实现方式是线性扫描,需要计算待测实例与每个实例的距离,在大数据上不可行。

  • KD树(KDTree)

    为了提高 k k k近邻搜索效率,考虑使用特殊的结构存储训练数据,以减少计算距离的次数,可以使用KD树(KD tree)方法。KD树分为两个过程——构造KD树(使用特殊结构存储训练集)、搜索KD树(减少搜索计算量)

  • 球树(BallTree)

2.2.1 构造KD树

KD 树的构建又有两种基本方法,一是维度轮替法,二是最大方差法。 维度轮替法是按照维度顺序进行构建。

  • 输入 : n n n 维空间数据集 T = { x 1 , x 2 , . . . , x N } T = \{x_1, x_2,..., x_N\} T={ x1,x2,...xN},其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T x_i= (x_i^{(1)}, x_i^{(2)},...,x_i^{(n)})^T xi=(xi
  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

healed萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值