【Intro to ML (机器学习)】1. k-Nearest Neighbor (k近邻)

0 前言

【Intro to ML】系列文章主要根据笔者基于University of Toronto (UofT) 交换学习期间的两门课程 Statistical Methods for Machine Learning I (2021 Fall)Introduction to Machine Learning (2021 Fall) 的个人学习笔记整理翻译而成,其中部分涉及的专业术语为自行翻译结果,可能会导致不准确的情况。若有不足,请不吝指出。



1 背景补充知识


1.1 维度诅咒(The Curse of Dimensionality)

笔者第一次接触到降维是于SHU数学系学习期间,《非线性科学》课程中讲到的PCA,KPCA等,并做了一个人脸识别的Project。但是关于为什么要降维,当时的认知只是认为是可以降低训练的工作量,过滤掉一些不必要的噪音(Noise),或者是过滤掉一些不必要的细节(比如说多个特征之间存在高度相关性,将其合并为一个特征也不会丢失太多信息),从而将棘手的问题转变为容易处理的问题。

在1.1的补充内容中,我们主要会讲到维度诅咒或者称为维度灾难(The Curse of Dimensionality),讨论一下在高维空间中更具体的一些问题。


1. 距离聚集效应(Distance Concentration)

首先我们给出超球体的体积计算公式:

V n = π n 2 Γ ( n 2 + 1 ) = C n R n V_n=\frac {\pi^\frac{n}{2}}{\Gamma(\frac{n}{2}+1)}=C_nR^n Vn=Γ(2n+1)π2n=CnRn

其中:

C n = π k k ! , n = 2 k , k ∈ N C_n=\frac{\pi^k}{k^!}, n=2k, k\in{N} Cn=k!πk,n=2k,kN
C n = 2 2 k + 1 k ! π k ( 2 k + 1 ) ! , n = 2 k + 1 , k ∈ N C_n=\frac{2^{2k+1}k^!\pi^k}{(2k+1)^!}, n=2k+1, k\in{N} Cn=(2k+1)!22k+1k!πk,n=2k+1,kN

R = 1 R=1 R=1,即我们考察单位超球体的体积,即等于 C n C_n Cn

通过计算,我们可以得出计算结果:

lim ⁡ x → + ∞ C n = 0 {\lim_{x \to +\infty}}C_n = 0 x+limCn=0

即说明,在无穷高维的空间中,单位超球体的体积为 0 0 0。事实上,单位超球体体积是先增后减的,比如二维空间单位超球体(圆)的体积为 3.1416 3.1416 3.1416,三维空间单位超球体(球)的体积为 4.1888 4.1888 4.1888,但是二十五维空间单位超球体的体积接近于 0 0 0

请记住以上特性,在之后的内容中我们会利用这一特性解释由此特性而导致的kNN的缺陷——距离聚集效应。


2. 组合爆炸(Combinational Explosion)

简单地来说,组合爆炸就是指随着维度的增加,模型所需要的搜索的空间也会指数级别地增加。事实上,这个论点看起来很容易理解,笔者将从理论的角度对这一论点进行直观地理解。

为了方便直观地感受,引用经典的解释便于直观理解,图源:The Curse of Dimensionality in classification

随着维数的增长,覆盖20%的特征范围所需的数据量呈现指数级增长
这个图直观地诠释了组合爆炸带来的效果:为了覆盖20%的所有特征范围,在1D空间中我们需要覆盖每个维度的20%的数据;在2D空间中我们需要覆盖每个维度的45%,即每个维度我们需要获得猫和狗总数的45%;在3D空间中我们需要覆盖每个维度的58%,即每个维度我们需要获得猫和狗总数的58%。因此,模型的搜索空间会随着维度的增加呈指数级别的增长,并带来两类危害:

  • 由于遍历的搜索空间变大,为防止过拟合现象,训练数据量会以指数级别增长,因此训练一个模型会消耗更多的时间以及更多的训练数据样本;
  • 如果训练数据量一定,继续添加维度就会导致过拟合(因为若维度继续增加,每个维度所需要的猫和狗总占比将达到非常高的比例从而导致过拟合);


1.2. 预备知识(Preliminaries)


机器学习的三大类型:监督学习(Supervised Learning),无监督学习(Unsupervised Learning)和强化学习(Reinforcement Learning),k-NN属于监督学习的一种。

具体到监督学习,我们会给出训练集(Training Set),具体会包括:

  • 输入(Input): x x x
  • 标签(Label): t t t

我们的目标是预测 t t t,或者是学习一个由 x x x t t t的映射(Mapping)。


1. 输入向量(Input Vector)

关于输入(Input)部分,我们常常将一些图像转化成矩阵进行处理,会将图片每个像素所对应的不同色块以不同的整数来进行替代,具体可以参见下图:
图源:Andrej Karpathy
接着,我们可以将矩阵转化为向量,因此我们就实现了将图片转化为向量的关键一步。
在这里插入图片描述


2. 标签(Label)

标签可以用于多种用途,比如说:

  • 回归(Regression):比如用于预测周围温度;
  • 分类(Classification):所有的标签都是离散集合的一个元素,比如 1 1 1表示猫, 2 2 2表示象,等;
  • 结构性预测(Structured Prediction):比如说,一个图象也可以作为一个标签;


3. 训练集(Training Set)

从数学的角度出发, 训练集由一系列的 ( x , t ) (x, t) (x,t)组成,其中 x ∈ R d x\in R^d xRd,代表输入(Input), t t t代表 x x x对应的标签(Label)。

于是,我们可以得到一个训练集:
( x ( 1 ) , t ( 1 ) ) , ( x ( 2 ) , t ( 2 ) ) , ( x ( 3 ) , t ( 3 ) ) , . . . , ( x ( N ) , t ( N ) ) {{{(x^{(1)},t^{(1)}),(x^{(2)},t^{(2)}),(x^{(3)},t^{(3)}),...,(x^{(N)},t^{(N)})}}} (x(1),t(1)),(x(2),t(2)),(x(3),t(3)),...,(x(N),t(N))

  • 注意,上标并不代表指数的意思
  • 我们的目标是找到一个映射:
    x ( i ) → t ( i ) {{{x^{(i)}\to t^{(i)}}}} x(i)t(i)
    使得该映能将给定的 x ( i ) x^{(i)} x(i)更准确地贴上对应的标签 t ( i ) t^{(i)} t(i)



2 近邻算法(Nearest Neighbors)


2.1 思想


  • 假设我们有一个输入向量 x x x,并希望将其进行分类;
  • 找到在训练集中距离 其最近的一个输入向量 x ∗ x^* x,并将其标签 t ∗ t^* t作为 x x x的标签;
  • 因此 t = t ∗ t = t^* t=t,分类完成;

在此过程中,距离的衡量有很多种方式,我们可以通过欧式距离进行衡量,即:
∣ ∣ x ( a ) − x ( b ) ∣ ∣ = ∑ j = 1 d ( x j ( a ) − x j ( b ) ) 2 ||x^{(a)} - x^{(b)}|| = \sqrt{\sum_{j=1}^{d}(x_{j}^{(a)}-x_{j}^{(b)})^{2}} x(a)x(b)=j=1d(xj(a)xj(b))2


2.2 算法流程


  1. 找到训练集中与 x x x最接近的数据 ( x ∗ , t ∗ ) (x^*,t^*) (x,t),即:

x ∗ = a r g min ⁡ x i ∈ t r a i n . s e t d i s t a n c e ( x ( i ) , x ) ; x^*=arg \min_{x^{i}\in train.set}distance(x^{(i)},x); x=argxitrain.setmindistance(x(i),x);

  1. 输出 y = t ∗ y=t^* y=t


2.3 算法缺陷


由于近邻算法是根据其最接近的训练集数据进行分类(贴标签),因此分类的结果极其易受到噪声的影响,从而导致误差,下图解释了这一现象。在噪声样本(Noisy Sample)中,黑点(我们称为Query Point)及其所在的浅蓝色区域都将被分类为蓝色,显然这有悖于真实的分类结果,并造成了误差。

分类错误案例
因此,找到一种更具有普适性的,不易受到噪音影响的算法尤为地重要,kNN算法则较好地解决了这个问题。



3 k-近邻算法(k-Nearest Neighbors)


3.1 算法流程


  1. 找到训练集中与 x x x最接近的 k k k个数据 ( x ( i ) , t ( i ) ) (x^{(i)},t^{(i)}) (x(i),t(i))
  2. 输出的分类结果则为:
    y = a r g max ⁡ t ( z ) ∑ i = 1 k I ( t ( z ) = t ( i ) ) y=arg \max_{t^{(z)}}\sum_{i=1}^{k}I(t^{(z)}=t^{(i)}) y=argt(z)maxi=1kI(t(z)=t(i))
    I ( s t a t e m e n t ) = { 0 False 1 Truth I(statement)= \begin{cases} 0& \text{False}\\ 1& \text{Truth} \end{cases} I(statement)={01FalseTruth

k-NN算法的意义在于,找到距离最近的 k k k个点之后,按照少数服从多数原则,将待分类的点 x x x分类到 k k k个点中最多分类的类别中。


3.2 k-NN算法的优势


k=1
k=15
上面两张图分别是 k = 1 k=1 k=1 k = 15 k=15 k=15时的两种分类结果,可以明显地看到第二张图具有更优的分类效果。

但是, k k k应该怎么选取呢?是值越大越好吗?


3.3 k k k 值的权衡


  1. k k k 值小

    k k k值偏小时,我们能得到一个更具有细密纹理性的(fine-grained)结果,但是我们会对一些异常点或随机噪声非常敏感,我们称这种现象为过拟合(Overfitting)。

  2. k k k值大

    k k k值偏大时能够做出更稳定的分类结果,但是会导致对重要细节信息的缺失,我们称为低拟合(Underfitting)。

  3. k k k值的权衡
    最优 k k k 的选取取决于数据点的总数 n n n ,通常根据经验法则,我们将选取:
    k < n k < \sqrt{n} k<n


3.3 泛化误差(Generalization Error)


除了训练集以外,为了测试模型的优劣,我们需要使用新的,没有看见过的(Unseen)的数据用来测试,我们称这一类以一对数据向量和标签组合(Input-Label Pairs)的数据集合 ( x , t ) (x,t) (x,t)为测试集。在测试过程中,模型对于新的例子(即测试集)而导致的误差称为泛化误差(Generalization Error)。

在这里插入图片描述
上图给出了随着 k k k 值的增大,测试集和训练集的误差变化,其中橙色代表测试集,蓝色代表训练集。

对于训练集,当 k = 1 k = 1 k=1时,由于距离待分类点 x x x最近的一个点(假设为 x ∗ x^* x)的标签为 t ∗ t^* t,且 x x x的分类结果总是为距离最近的标签,所以 t t t 恒等于 t ∗ t^* t,故误差为零。但是随着 k k k 的增加,k-NN算法会导致分类结果变得更加光滑(Smooth),进而会导致一定的误差,且这种误差会逐渐增加。因此,训练集的误差曲线是一个上升曲线。

对于测试集,由于 k k k值的增加,过拟合的效果会逐渐下降,低拟合的效果会逐渐加强。但是由于在最初时,过拟合的下降效果显著于低拟合的加强效果,因此误差下降;到 k > 10 k>10 k>10时(仅限本例中),低拟合的加强效果显著于过拟合的下降效果,因此误差再次上升。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值