从0开始学习计算机视觉--Day03--K近邻算法

发布于:2025-06-24 ⋅ 阅读:(12) ⋅ 点赞:(0)

上次我们提到了用L1距离去区分不同的图片,实际上它的原理也能用来区分不同的数据。但有个坏处是他只是取最近的拥有一样距离的点作为同一类,假如有一个点跟周围的点的距离都是不一样的,分类器很可能会把他当成独立的一类,如下图所示:

图中的点代表数据,背景颜色代表其被分类器给予的标签,可以看到数据点被很好的分类了,除了绿色数据中的一个黄色点,分类器将其判断为了与绿色不同的黄色,但实际上,这个点看起来很可能是因为噪音的影响,产生了异常的数据从而使分类器判断错误,就好比在根据身高分组时,有个残疾人原本的身高属于A组,但由于被截肢了,身高发生改变,而后续身高与其现在差不多的就会被分到他同一组,从而使分类器产生误判。

鉴于此,K近邻算法可以较好地减少这种噪音或极端数据的影响,他在比较距离的基础上加入了投票的机制,即找到最近点后还会设置应该有多少个距离相近的点才能被分为一类,一般会将K值设置的比较大,这样能够减少局部特征对总体分类的影响。

除了L1之外,我们还有一种距离度量的方法L2,采用的是数据之间的平方差的平方根,这样做的好处一是如果数据本身的构造没有太大意义(即不知道数据的特点或只是普通数据),L2计算距离的方法更流畅些(体现在坐标系上是因为计算公式代表了点座落在了一个圆上),二是在后续计算参数时能方便求导。

像K近邻算法的K值以及L1、L2这种距离度量的选择,我们称之为超参数,以为模型在训练的过程中并不一定能学习到该如何选择,我们需要在训练前就设置好。那么问题来了,我们该怎么选择超参数,或者说以什么为目标去调节超参数呢?这里有一个反直觉的事实是,尽管我们的模型以准确率为指标,但这是针对的是训练过程中的指标,如果本着调高准确率去调节超参数,只能得到一个在训练中表现良好的模型,但其在未知数据的预测中表现会较差,这就是我们所说的过拟合现象。所以我们一般会选择将数据分为三个部分,第一个部分用于训练模型以及调节诶超参数,第二个部分数据用于验证超参数的表现,进一步筛选,第三部分则用于评估算法在未知数据上的表现,即我们所说的训练集、验证集和测试集。要注意的是,验证集和测试集要保证没有被数据泄露(也就是其中的数据的细节或特点没有被用于模型训练),这样才能保证算法和研究的真实性。

如果我们碰到数据量较小的数据集时,由于要分配数据,所用的验证集的数据量会很小,结果不一定对超参数的选择有意义,此时我们可以选择用交叉验证的方式来对超参数进行择优,即还是将一部分数据作为测试集,但剩下的不再分为训练集和验证集,而是将数据分为几份,分别取其中一份作为验证集,对算法进行反复验证,取超参数表现比较稳定的那一组作为结果,若数据量较大则不建议这么做,因为数据量较大就不需要额外处理验证集,且这样的多次训练会消耗大量时间和算力,得不偿失。

但K近邻算法基本很少用于图像分类,一是因为算法在训练时所用的时间很短,测试时的时间很长(因为测试时会将每个测试图片与每个训练图片计算距离再去对比),计算量很大;二是因为算法要求数据在空间上的分布需要密集,而要满足这个需要指数倍的数据,比如说在一维上,只需要四个点就能满足密集分布的话,在二维上就需要16个点,三维上就需要64个点,以此类推,会增加很大的计算负担。

学习来自于斯坦福教程:Stanford University CS231n: Deep Learning for Computer Vision


网站公告

今日签到

点亮在社区的每一天
去签到