基于K近邻(K-Nearest Neighbors, KNN)的图像分类算法
题目描述
K近邻(KNN)是一种经典的机器学习算法,其基本思想是“物以类聚”。在图像分类任务中,给定一张待分类的未知图片,算法会在已知标签的图片库(称为训练集)中,找到与它“最像”的K张图片,然后统计这K张图片的类别,将出现次数最多的类别作为未知图片的预测类别。
这个“最像”就是由“距离”来度量的。因此,KNN算法的核心在于两点:1) 如何将一张图片转换成一个可计算距离的数学表示(特征向量);2) 如何定义和计算两个特征向量之间的距离。
下面,我将为你拆解KNN图像分类的完整步骤。
解题过程
假设我们已经有一个图片训练集,每张图片都有明确的类别标签(如“猫”、“狗”、“汽车”)。现在收到一张新的测试图片,需要预测其类别。
步骤一:图片特征提取
我们不能直接使用原始的像素矩阵(例如,一张256x256的RGB图片有近20万个数值)来计算距离,因为维度太高、计算量太大,且原始像素对光照、平移等变化非常敏感。因此,我们需要提取能够代表图片核心内容的、更紧凑的数值特征。
常见的传统图像特征包括:
- 颜色直方图:统计图片中每种颜色出现的频率。一个颜色空间(如RGB、HSV)被量化为N个区间(bin),特征向量就是一个N维的向量,每个值代表对应颜色区间的像素数量占比。它对物体形状和轻微旋转变化不敏感,但能很好地表达颜色分布。
- 方向梯度直方图:计算图片局部区域的梯度方向,并统计成直方图。它对物体的轮廓和形状非常敏感,是行人检测等任务的经典特征。
- 尺度不变特征变换 特征袋:先通过SIFT等算法检测关键点并提取局部描述符,然后对所有描述符进行聚类(如K-Means),形成一本包含K个“视觉单词”的词典。最后,统计一张图片中每个“视觉单词”出现的次数,形成一个K维的直方图向量。这个特征对尺度、旋转、光照变化有一定鲁棒性。
为了简化说明,我们假设使用64维的HSV颜色直方图作为特征。这样,训练集中的每张图片I_i,都被表示为一个64维的特征向量F_i = [f1, f2, ..., f64]。
步骤二:计算特征距离
现在,我们有了测试图片的特征向量F_test。需要计算它与训练集中每一张图片特征向量F_train的距离。距离越小,代表两张图片越相似。
常用的距离度量包括:
- 欧氏距离:最直观的距离。在n维空间中,两点之间的直线距离。公式为:
d = sqrt( (f1_test - f1_train)^2 + (f2_test - f2_train)^2 + ... + (f64_test - f64_train)^2 )。计算所有维度差值的平方和,再开方。 - 曼哈顿距离:各维度差值绝对值的和。公式为:
d = |f1_test - f1_train| + |f2_test - f2_train| + ... + |f64_test - f64_train|。 - 余弦相似度:测量两个向量方向的差异,而非绝对位置。公式为:
cosθ = (F_test · F_train) / (||F_test|| * ||F_train||),值越接近1越相似。有时用1 - cosθ作为距离。
我们选择欧氏距离。计算F_test与所有训练图片F_train_i的距离,得到一个距离列表[d1, d2, ..., dN],其中N是训练集图片总数。
步骤三:选取K个近邻
对步骤二得到的距离列表进行从小到大排序。选择距离最小的前K个样本。这K个训练样本就是测试图片在特征空间中的“K个最近邻”。
参数K的选择至关重要:
- K值过小:分类结果容易受到噪声点或个别异常样本的影响,模型变得“敏感”和“不稳定”。
- K值过大:距离很远的、不相关的样本也会参与投票,可能使分类边界模糊,导致预测偏差。
- K值通常通过交叉验证等实验方法确定,是一个奇数(为了避免平票),例如1, 3, 5, 7等。
假设我们设定K=5,那么我们就找到了5张与测试图片最相似的训练图片。
步骤四:投票决定类别
查看这K个近邻样本各自的已知标签。采用“多数表决”原则,将K个邻居中出现次数最多的那个类别,指定为测试图片的预测类别。
例如,K=5时,5个邻居的标签分别是:[猫, 狗, 猫, 猫, 狗]。统计结果:“猫”出现3次,“狗”出现2次。因此,测试图片被预测为“猫”。
步骤五:输出结果
算法最终输出测试图片的预测类别标签“猫”。如果需要,还可以输出其属于每个类别的概率估计(例如,猫的概率是3/5=0.6,狗的概率是2/5=0.4)。
总结与特点
- 优点:原理简单直观,无需训练模型参数(“懒学习”),在多类别分类上通常表现不错。
- 缺点:
- 计算成本高:预测时需要计算测试样本与所有训练样本的距离,当训练集很大时,预测速度慢。
- 特征与距离度量的依赖性:性能极度依赖于特征提取的好坏和距离度量的选择。
- 维度灾难:当特征维度非常高时,数据在空间中变得非常稀疏,任何两点间的距离都趋于相似,导致算法失效。
- 类别不平衡敏感:如果某个类的样本数量远多于其他类,则该类的样本在特征空间中可能占主导,导致测试样本的K个邻居大多属于这个大类,从而做出错误预测。
在现代深度学习兴起之前,KNN结合HOG、SIFT等手工特征是图像分类的经典流程之一。虽然如今在复杂任务上已被深度学习超越,但其思想在理解机器学习基本范式、以及在某些特定场景(如小样本、简单特征)中仍有重要价值。