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

KNN及SVM人脸识别

  • 1 基于KNN的人脸识别
    • 1.1 KNN算法描述
    • 1.2 改进的WK-NNC实验验证
    • 1.3 KNN算法的优势和劣势
  • 2 基于SVM的人脸识别
    • 2.1 SVM二分类算法描述
    • 2.2 SVM多分类算法描述
    • 2.3 实验验证
    • 2.4 SVM算法的优势和劣势
  • 3 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值下的参考样本。
【模式识别2】KNN及SVM人脸识别_第1张图片

通常情况下,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及SVM人脸识别_第2张图片
    划分完成后将生成两个文件夹:
    在这里插入图片描述
    通过简单的编码方式对不同类别的不同图像进行命名,后续通过简单的解码即可加载数据集。 数据划分之后的训练集图像样例如下:
    【模式识别2】KNN及SVM人脸识别_第3张图片
    划分完成后,需要将数据读入内存以输入算法进行计算。如下图所示,分别为训练集、验证集的图像和标签定义数组。注释中展示了各数组的维度:
    在这里插入图片描述

  2. 数据预处理
    在将数据输入KNN算法前,需要将数据进行归一化处理。使用极差法,如下图代码所示。
    【模式识别2】KNN及SVM人脸识别_第4张图片
    为了避免二维图像展平成一维向量时引起的维度灾难问题,可以先对原特征进行降维,再利用KNN算法进行分类,常用降维方法有PCA。

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

  4. 对比实验
    这一部分对不同的距离度量方法和不同K值进行对比实验,以选择合适的距离度量方法和K值。
    【模式识别2】KNN及SVM人脸识别_第7张图片
    四组对比实验不同K值的识别准确率曲线如下:
    【模式识别2】KNN及SVM人脸识别_第8张图片
    由验证集精度曲线可以看出,K取3或4的分类效果最好,且改进的WK-NNC算法效果比KNN算法效果更好,WK-NNC与曼哈顿距离组合的效果最好,精度达到了98.33%。

1.3 KNN算法的优势和劣势

优点:

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

缺点:

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

2 基于SVM的人脸识别

算法流程图如下:
【模式识别2】KNN及SVM人脸识别_第9张图片

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文件中。
    【模式识别2】KNN及SVM人脸识别_第10张图片
    生成的数据集文件:
    在这里插入图片描述

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

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

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

序号 归一化 核函数 N C SVM类型 验证集准确率(%)
1 linear 20 0.5 ovo 97.50
2 × linear 20 0.5 ovo 96.67
3 linear 50 0.5 ovo 99.17
4 linear 100 0.5 ovo 99.17
5 linear 200 0.5 ovo 99.17
6 linear 50 0.1 ovo 99.17
7 linear 50 1.0 ovo 99.17
8 linear 50 5.0 ovo 98.33
9 linear 50 100.0 ovo 98.33
10 × linear 50 0.5 ovo 98.33
11 poly 50 0.5 ovo 44.17
12 poly 50 1.0 ovo 65.83
13 poly 50 10.0 ovo 87.50
14 poly 50 100.0 ovo 87.50
15 poly 10 10.0 ovo 88.33
16 poly 30 10.0 ovo 89.17
17 rbf 10 0.5 ovo 53.33
18 rbf 10 1.0 ovo 86.70
19 rbf 10 10.0 ovo 95.00
20 rbf 10 50.0 ovo 95.00
21 rbf 10 100.0 ovo 95.00
22 rbf 30 10.0 ovo 97.50
23 rbf 50 10.0 ovo 99.17
24 rbf 100 10.0 ovo 99.17
25 rbf 200 10.0 ovo 98.33
26 × rbf 50 10.0 ovo 98.33
27 × rbf 100 10.0 ovo 99.17
28 × rbf 200 10.0 ovo 98.33
29 linear 50 0.5 ovr 98.33
30 rbf 50 10.0 ovr 99.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算法对比

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

你可能感兴趣的:(模式识别,python,算法)