【模式识别2】KNN及SVM人脸识别


用到的数据集、代码等资源文件:

  1. ORL数据集
  2. WK-NNC.py----文中KNN部分源代码
  3. PCA_SVM.py----文中SVM部分源代码

1 基于KNN的人脸识别

1.1 KNN算法描述

KNN(K-Nearest Neighbor,K最近邻)算法可以用于分类和回归任务,是一种监督学习算法。它的主要思路是,如果一个样本在特征空间中的K个距离最近的样本中大多数属于某一个类别,则该样本也属于这个类别。如下图所示,不同圆圈范围表示不同K值下的参考样本。
在这里插入图片描述

通常情况下,KNN分类算法的计算过程如下:

  1. 计算待分类点与已知类别的点之间的距离。
  2. 按照距离进行递增次序排序。
  3. 选取与待分类点距离最小的K个点。
  4. 确定前K个点所在类别的出现次数,以出现次数最高的类别作为待分类的的预测分类。

然而在使用KNN算法需要注意几个问题:

  1. 超参数K的取值。
  2. 距离度量方法,特征空间中样本点的距离是样本点间相似程度的反映。常见的距离度量方法由欧氏距离、曼哈顿距离、马氏距离、切比雪夫距离等。
  3. 分类决策的规则。

1.2 改进的WK-NNC实验验证

  1. 划分及读取数据集
    本次实验将ORL数据集划分为训练集(traningSet)和验证集(testingSet),比例为7:3。除了此种数据集划分方法外,还可以将其划分为训练集、验证集、测试集,比例可以设为6:2:2,在训练集与验证集上做交叉验证,选择合适的K值,再在测试集上进行测试。
    下图展示了划分数据集的代码,对原始ORL数据集每个类别的样本打乱,按照预先设定的proportion比例划分训练集和验证集。
    在这里插入图片描述
    划分完成后将生成两个文件夹:
    在这里插入图片描述
    通过简单的编码方式对不同类别的不同图像进行命名,后续通过简单的解码即可加载数据集。 数据划分之后的训练集图像样例如下:
    在这里插入图片描述
    划分完成后,需要将数据读入内存以输入算法进行计算。如下图所示,分别为训练集、验证集的图像和标签定义数组。注释中展示了各数组的维度:
    在这里插入图片描述

  2. 数据预处理
    在将数据输入KNN算法前,需要将数据进行归一化处理。使用极差法,如下图代码所示。
    在这里插入图片描述
    为了避免二维图像展平成一维向量时引起的维度灾难问题,可以先对原特征进行降维,再利用KNN算法进行分类,常用降维方法有PCA。

  3. WK-NNC分类
    传统KNN算法对K个样本的权重相同,然而对于度量距离更近的样本,往往更倾向于是同类样本,基于此可以改进传统KNN算法,将距离待测样本更近的样本赋予更大的权重。
    在这里插入图片描述
    将待测样本与所有训练集的度量距离进行升序排序,选择最邻近K个样本的距离并计算其权重,同时记录其数组索引。最后让K个最邻近带权样本投票,选择投票得分最高的类别即可得到待测样本的识别类别,代码如下:
    在这里插入图片描述
    当K=4且采用欧氏距离时,验证集(120张图)上准确率达到96.67%,程序运行结果如下:
    在这里插入图片描述

  4. 对比实验
    这一部分对不同的距离度量方法和不同K值进行对比实验,以选择合适的距离度量方法和K值。
    在这里插入图片描述
    四组对比实验不同K值的识别准确率曲线如下:
    在这里插入图片描述
    由验证集精度曲线可以看出,K取3或4的分类效果最好,且改进的WK-NNC算法效果比KNN算法效果更好,WK-NNC与曼哈顿距离组合的效果最好,精度达到了98.33%。

1.3 KNN算法的优势和劣势

优点:

  1. 思想简单,理论成熟,既可以做分类又可以做回归
  2. KNN的决策边界一般不是线性的,因此可以用于非线性分类任务
  3. 基本上无需训练,因此训练时间复杂度比SVM等算法低

缺点:

  1. 计算量大,对于每个待测样本均要与所有训练集计算距离,导致预测速度比逻辑回归等算法慢。且不适用于特征维度高的数据,引起维度灾难。
  2. 样本不均衡时,对稀有类别的预测准确率有所降低。

2 基于SVM的人脸识别

算法流程图如下:
在这里插入图片描述

2.1 SVM二分类算法描述

SVM的对偶算法有三类:

  1. 线性可分SVM,通过硬间隔最大化求解
  2. 近似线性可分SVM,通过软间隔最大化求解
  3. 非线性SVM,通过核技巧及软间隔最大化求解
    输入:训练集
    输出:分离超平面和分类决策函数。
    算法详细描述暂时省略,后续有时间补上。。

2.2 SVM多分类算法描述

上一节描述了二分类的SVM算法,然而当处理多分类问题时,需要构造合适的多分类器。目前构造SVM多分类器方法有两类:(1)直接法,即直接在目标函数上进行修改,将多个分类超平面的参数求解合并到一个最优化问题中,通过求解该最优化问题实现多分类。这种方法计算复杂度比较高,实现起来较为困难;(2)间接法。主要通过组合多个二分类器来实现多分类器的构造,常见方法有一对多法和一对一法:
a. 一对多法(one-versus-rest,简称1-v-r-SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
b. 一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。

2.3 实验验证

  1. 定义变量
    利用python的argsparse命令行解析标准模块,我们可以直接在命令行中向程序中传入参数并让程序运行。这里主要为了制作数据集文件,因此定义了原始ORL数据集路径和期望保存的数据集文件路径。
    在这里插入图片描述

  2. 制作数据集文件
    从原始ORL数据集路径下,利用Image图像处理库读取每类的每张图片,并将其从二维图像空间变换为一维向量,并在每个图像向量的最后一维添加该类的类别。将堆叠好的数据集保存在txt文件中。
    在这里插入图片描述
    生成的数据集文件:
    在这里插入图片描述

  3. 读数数据集、归一化处理、划分数据集
    从生成的数据集文件中读取图像向量和标签,并对数据集进行归一化处理,归一化的方法为极差法:
    (16)
    在这里插入图片描述
    将读取到的数据集按照7:3的比例随机划分为训练集和验证集。
    在这里插入图片描述

  4. PCA降维、训练SVM模型
    由于图像向量维度为92×102=10304,直接输入SVM进行训练会造成维数灾难,导致训练过程很慢,而PCA算法可以将数据降维,同时保存数据的主要信息,因此,我们对训练集拟合一个PCA模型,从而将图像向量降维。降维后的训练集直接输入SVM模型进行训练。
    在这里插入图片描述

  5. 对比实验
    用训练集拟合的PCA模型对验证集降维,并输入SVM模型进行预测。
    在这里插入图片描述
    根据上文可知,数据集是否归一化、PCA降维后的特征维度N、SVM惩罚因子C、以及SVM的核函数均会影响模型的好坏,因此,此部分进行消融实验,选择合适的参数组合,以训练分类效果更好的SVM模型,消融实验效果如下:

序号归一化核函数NCSVM类型验证集准确率(%)
1linear200.5ovo97.50
2×linear200.5ovo96.67
3linear500.5ovo99.17
4linear1000.5ovo99.17
5linear2000.5ovo99.17
6linear500.1ovo99.17
7linear501.0ovo99.17
8linear505.0ovo98.33
9linear50100.0ovo98.33
10×linear500.5ovo98.33
11poly500.5ovo44.17
12poly501.0ovo65.83
13poly5010.0ovo87.50
14poly50100.0ovo87.50
15poly1010.0ovo88.33
16poly3010.0ovo89.17
17rbf100.5ovo53.33
18rbf101.0ovo86.70
19rbf1010.0ovo95.00
20rbf1050.0ovo95.00
21rbf10100.0ovo95.00
22rbf3010.0ovo97.50
23rbf5010.0ovo99.17
24rbf10010.0ovo99.17
25rbf20010.0ovo98.33
26×rbf5010.0ovo98.33
27×rbf10010.0ovo99.17
28×rbf20010.0ovo98.33
29linear500.5ovr98.33
30rbf5010.0ovr99.17

由上述消融实验表格可以看出,发现影响SVM效果的主要因素有:

  1. 核函数
    采用linear核函数和rbf核函数效果较好,在验证集上的识别准确率最高均能达到99.17%,但需要选择合适的惩罚因子 。对于linear核函数, 取值较小;对于rbf核函数, 取值较大。
  2. PCA降维后的特征维度
    对于linear和rbf核函数的SVM模型,增加PCA降维后的特征维度 ,识别效果均能得到提升,这是因为随着 的提升,保留了更多的数据原始信息,因此更有利于分类。
  3. 数据归一化
    从第1、2和3、10以及23、26组实验可以看出,在训练SVM之前,对数据进行归一化处理也能提高模型识别准确率。

2.4 SVM算法的优势和劣势

优点:

  1. SVM理论基础比较完善,适用于数量少的样本。
  2. SVM可以利用内积核函数代替向高维空间的非线性映射,实现在更高维度上进行分类。
  3. 少数支持向量决定了最终结果,增删改非支持向量对模型没有影响,使得模型具有较好的鲁棒性。

缺点:

  1. SVM算法难以实施在大规模训练样本中。由于SVM是借助二次规划来求解支持向量的,而求解二次规划涉及m阶矩阵计算(m为样本个数)。因此随着m增大,计算内存开销和计算时间也会增大。

3 KNN算法与SVM算法对比

KNNSVM
基本原理是找到数据集中距离待测样本最近的K个值,再利用这K个值投票作为待测样本的预测结果使用超平面来分割数据集
没有训练过程,但预测时需要计算待测样本与数据集中所有样本的距离,当训练集和测试集很大时,预测效率低有训练过程,训练完直接得到分类超平面,分类结果仅由少数支持向量决定,且不再需要训练集数据,因此预测效率高
存在维数灾难问题,KNN基于距离进行分类,当维度增大时,单位距离内的样本点会减少,导致需要更远的距离才能找到临近点SVM通过非线性映射,将样本映射到高维特征空间,使得样本在高维空间线性可分,而使用核函数几乎不增加计算复杂性,从而在一定程度上避免了维数灾难问题
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wilbur11

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

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

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

打赏作者

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

抵扣说明:

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

余额充值