计算机视觉学习笔记【三】:k近邻法(KNN)
作者:互联网
k近邻法(KNN)
说明
本章内容与承接前面章节的内容。接下啦的内容会出现使用python代码的具体实现,因此在阅读接下来的内容之前建议对python的语法有一定了解。
简述
k近邻法(k-nearest neighbor, k-NN)是一种基本的分类方法(亦可用于回归问题,但不在该系列的讨论范畴)。其基本思想为:找到距离最近的k个邻居,选择人数最多的团伙并加入他们。比如:我身边最熟的3个人(即k=3)是张三、李四、王五,张三和李四都支持特朗普,而王五支持拜登,支持特朗普的人居多,那么我将选择支持特朗普。
算法过程
根据上一章对统计学习的介绍,我们知道,在统计学习中,我们首先需要一定的训练数据,对训练数据的处理、分析过程获得最佳模型的过程通常称为学习过程(可回看第一章内容)。而k近邻法没有显式的学习过程,它对训练数据仅仅是简单的记忆(之后会讲到它的代码实现,就能够很好地体现这一点),没有抽象出所谓的模型。以下,我们将通过数学语言对该算法过程进行一个概述。
现有训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 x i ∈ X ⊆ R n x_i \in \mathcal{X} \subseteq \bold{R}^n xi∈X⊆Rn为实例的特征向量, y i ∈ Y = { c 1 , c 2 , . . . , c K } y_i \in \mathcal{Y} = \{c_1,c_2,...,c_K\} yi∈Y={c1,c2,...,cK}为实例的类别, i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N。
目的:
现给定输入: x N + 1 ∈ X x_{N+1}\in\mathcal{X} xN+1∈X
要求输出: x N + 1 x_{N+1} xN+1对应的类别 y N + 1 ∈ Y y_{N+1}\in\mathcal{Y} yN+1∈Y。
算法:
1、计算出 x N + 1 x_{N+1} xN+1与训练集中 x 1 , x 2 , . . . , x N x_1,x_2,...,x_N x1,x2,...,xN的距离(距离的度量方式有多种)。
2、找出距离 x N + 1 x_{N+1} xN+1最近的k个点,根据分类决策规则(通常为多数表决),得到相应的类别 y y y。
举个栗子
为了方便理解,我将举一个有关“管辖权”的例子。设世界上的人分为红色阵营和蓝色阵营,他们分布于世界的各个角落。设输入空间 X ∈ R 2 \mathcal{X} \in \bold{R}^2 X∈R2,即 x i = [ x i ( 1 ) , x i ( 2 ) ] x_i=[x_i^{(1)},x_i^{(2)}] xi=[xi(1),xi(2)],每个输入有两维特征,他表示的是每个人的位置(不妨设第一维特征表示坐标轴的 x x x分量,第二位特征表示坐标轴的 y y y分量)。那我们就可以用一个平面图来表示各个输入向量了。设输出空间 Y = { c 1 , c 2 } Y=\{c_1,c_2\} Y={c1,c2}= { 红 色 阵 营 , 蓝 色 阵 营 } \{红色阵营,蓝色阵营\} {红色阵营,蓝色阵营}。这些阵营的人,将世界进行划分。
如上图所示, “ ⋅ ” “·” “⋅”表示各个属于“红色阵营”的人的位置, “ × “\times “×”表示各个属于“蓝色阵营”的人的位置。他们的划分依据是“就近原则”,即哪个位置离谁更近,那谁就有这个位置的管辖权。上图可以很清晰的阴影区域就表示受蓝色阵营管辖的区域,或者说,是他的领土,而白色区域则是红色阵营的领土。
但世界上的人不能总是固定不变吧,总得有新生婴儿的出现。那么新生婴儿又应当属于哪个阵营呢?很简单,在哪个阵营的领土上出生,那就是哪个阵营的。
以上例子,其实就是k临近算法的一个形象过程,并且以上例子中的k=1。若k不等于1,比如k=3,那么我们不能看哪个位置离谁更近就属于哪个领地,而要看距离该位置最近的三个人属于哪个阵营,如果这三个人红花色阵营居多,那就属于红色阵营的领地,否则就属于蓝色阵营的领地。
k-NN三要素
1、距离度量
距离度量是k-NN当中决定谁离样本点“更近"。以上举的红蓝阵营的例子,使用的距离度量是欧氏距离(虽然我没有明说,但是根据大家的常识,这理所应当)。比如上述例子中
x
1
,
x
2
x_1,x_2
x1,x2的距离
d
=
(
x
1
(
1
)
−
x
2
(
1
)
)
2
+
(
x
1
(
2
)
−
x
2
(
2
)
)
2
d=\sqrt{(x_1^{(1)}-x_2^{(1)})^2+(x_1^{(2)}-x_2^{(2)})^2}
d=(x1(1)−x2(1))2+(x1(2)−x2(2))2
。而对于一般的输入,其特征维度不一定是二维,它可以是n维,我们对距离的定义(也成为闵可夫斯基距离)如下:
L
p
(
x
1
,
x
2
)
=
(
∑
l
=
1
n
∣
x
i
(
l
)
−
x
j
(
l
)
∣
p
)
1
p
L_p(x_1,x_2)=\bigg(\sum^n_{l=1}|x_i^{(l)}-x_j^{(l)}|^p\bigg)^{\frac{1}{p}}
Lp(x1,x2)=(l=1∑n∣xi(l)−xj(l)∣p)p1
当
p
=
1
p=1
p=1时,称为曼哈顿距离;当
p
=
2
p=2
p=2时,称为欧几里得距离(欧氏距离);当
p
=
∞
p=\infty
p=∞时,表示的是各个坐标距离的最大值,称为切比雪夫距离。公式如下:
L
1
(
x
1
,
x
2
)
=
(
∑
l
=
1
n
∣
x
i
(
l
)
−
x
j
(
l
)
∣
)
L
2
(
x
1
,
x
2
)
=
(
∑
l
=
1
n
∣
x
i
(
l
)
−
x
j
(
l
)
∣
2
)
1
2
L
∞
(
x
1
,
x
2
)
=
max
l
∣
x
i
(
l
)
−
x
j
(
l
)
∣
L_1(x_1,x_2)=\bigg(\sum^n_{l=1}|x_i^{(l)}-x_j^{(l)}|\bigg)\\ L_2(x_1,x_2)=\bigg(\sum^n_{l=1}|x_i^{(l)}-x_j^{(l)}|^2\bigg)^{\frac{1}{2}}\\ L_{\infty}(x_1,x_2)=\max_l|x_i^{(l)}-x_j^{(l)}|
L1(x1,x2)=(l=1∑n∣xi(l)−xj(l)∣)L2(x1,x2)=(l=1∑n∣xi(l)−xj(l)∣2)21L∞(x1,x2)=lmax∣xi(l)−xj(l)∣
以上三个距离在二维平面中可以用以下图来表示:
如上图所示,表示的是当p取不同值时,与原点距离为1的点的图形。
距离度量的选择与具体应用有关,需结合具体情况具体分析。有时难以明确距离的优劣时,就把各种距离都试一遍。
2、k值的选择
k值的选择决定了模型的复杂度。当k越小时,模型越复杂,将可能发生过拟合的现象。
上图就体现了当k取不同值时,训练数据集对空间的划分(输入向量是一个二维向量),图中不同颜色表示的就是样本所属的不同类别。当k=1时,所得到的图形就如前面所举的红蓝阵营例子相同;而当k=3时,在它对空间的划分更加单纯,可以看到在绿色的那一块区域中,即便出现了黄色类型的点(被认为是噪点),但依旧属于绿色类别。原因在于黄色样本点周围的位置,距离最近的三个点,有两个是绿色样本点。图中还会出现白色的区域,这些区域是具有争议的区域,即距离白色区域最近的三个点,类型都不同,即1:1:1,无法通过少数服从多数的方式决定属于哪个类别。
在实际应用中,我们常常使用交叉验证法的方式去寻找最佳的k值。
3、分类决策规则
我们往往用的分类决策规则是多数表决。其实在前面用的都是这种分类决策规则,即少数服从多数,选择人数多的团伙加入。它的依据在于使得经验风险最小化。
注:以上我们用了各种图形表示各个样本点之间的关系,之所以可以用图形表示,是因为我们假设输入的样本是一个二维向量,而二维向量是可视化。但实际上,我们在图像处理中,输入向量的维度是远远大于2的,如此庞大的维度虽然无法可视化,但其原理与二维相同,因此我们可以使用二维这一特殊情况辅助我们理解。
k-NN法在图形分类中的应用
以下我们将使用python代码进行辅助说明。
三步骤
统计学习的三步骤可以概括为获取训练数据、学习(训练)、预测。
获取训练数据
我们的训练数据来自于CIFAR10。该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图。上图就随机选取了各个类别的几张图予以显示。
学习与预测
前面说过,k-NN法没有显式的学习过程,它在实现代码中的体现为,用于训练(学习)的函数只是单纯的将各个图像进行存储,包括图像所属的类别。
而预测函数所要做的就是计算所要预测的图像与训练集中各个图像的距离并取k值近邻,预测类别。
输入空间、输出空间
在图像的处理中,我们处理的对象是图形中的一个个像素。每个像素都是图像的一维特征,假设图像尺寸为32*32,那么输入向量 x x x则是一个32*32=1024维的向量。因此输入空间是一个1024维向量的集合。输出空间 y y y,若采用CIFAR10的数据则是一个10维向量,表示的是10个不同类别。
训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},表示的是图像与所属类别构成的输入输出对。
距离计算
若我们采用曼哈顿距离度量方式,就是将两个图像每个像素的值相减并求和即可,如上图所示。其他距离度量的计算方式同理。我们主要使用两种距离度量:曼哈顿距离和欧氏距离。
超参数的选取
k-NN当中的两个重要要素是距离度量和k值的选择,像这种无法通过训练数据直接获取的参数我们称为超参数。通常,我们会通过交叉验证的方法,获取验证集准确率最高的一组超参数。
算法评价
算法复杂度
该算法学习过程的时间复杂度为O(1),而预测的时间复杂度为O(N),N为训练数据集的尺寸。事实上这并不利于实现,因为在实际情况中,学习的过程往往是在某些数据中心,而这些数据中心使用的计算机算力较高,因此学习过程的复杂度可以更大。但是用于预测的设备可能是一部手机,一个智能穿戴设备,它们的功耗小,算力相对较低,我们希望预测的复杂度可以足够小、足够快,从这一角度来看,这不是一个好的方法。
可靠性
如上图所示,第一张照片与右边三张照片的欧氏距离相同,但显然图片是不同的。所以k-NN中的距离度量所承载的信息不够多,不足以体现图像的区别。所以这样的方式是粗略的。
维数灾难
如上图所示,我们设输入向量 x x x由 n n n个维度,每个维度有4个取值。当 n = 1 n=1 n=1时,要使样本布满输入空间只需要 4 4 4个;当 n = 2 n=2 n=2时,则需要 4 2 4^2 42个;当 n = 3 n=3 n=3时,则需要 4 3 4^3 43个。这说明,要令样本布满整个空间所需要的数量呈指数型增长。也就是说,在样本数量一定时,如设样本数量为2,当n=1时,样本数量占空间的50%;当n=2时,样本数量占空间的12.5%;当n=3时,样本数量占空间的3.125%。这说明当样本数量有限的情况下,维度越多,那么样本的分布就越稀疏。这在统计学习中显然是不好的,我们当然希望样本在空间中排布的满越密集越好,只有这样才能获取更充分的信息。当信息不足时,k-NN模型这种非线性的模型,会导致过拟合现象的产生。而图像向量的维数是很高的(每个像素都视为一个维度),这也就很容易导致维数灾难,出现过拟合的问题。这里推荐一篇blog,https://blog.csdn.net/zbc1090549839/article/details/38929215供参考。
总结
可以看到,k-NN法在上述的应用中有诸多缺陷,因此在实际的应用中,我们通常不会使用这种算法。
标签:KNN,训练,近邻,样本,距离,x2,笔记,阵营,x1 来源: https://blog.csdn.net/weixin_45917567/article/details/113730913