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 基于KNN的人脸识别
1.1 KNN算法描述
KNN(K-Nearest Neighbor,K最近邻)算法可以用于分类和回归任务,是一种监督学习算法。它的主要思路是,如果一个样本在特征空间中的K个距离最近的样本中大多数属于某一个类别,则该样本也属于这个类别。如下图所示,不同圆圈范围表示不同K值下的参考样本。
通常情况下,KNN分类算法的计算过程如下:
- 计算待分类点与已知类别的点之间的距离。
- 按照距离进行递增次序排序。
- 选取与待分类点距离最小的K个点。
- 确定前K个点所在类别的出现次数,以出现次数最高的类别作为待分类的的预测分类。
然而在使用KNN算法需要注意几个问题:
- 超参数K的取值。
- 距离度量方法,特征空间中样本点的距离是样本点间相似程度的反映。常见的距离度量方法由欧氏距离、曼哈顿距离、马氏距离、切比雪夫距离等。
- 分类决策的规则。
1.2 改进的WK-NNC实验验证
- 划分及读取数据集
本次实验将ORL数据集划分为训练集(traningSet)和验证集(testingSet),比例为7:3。除了此种数据集划分方法外,还可以将其划分为训练集、验证集、测试集,比例可以设为6:2:2,在训练集与验证集上做交叉验证,选择合适的K值,再在测试集上进行测试。
下图展示了划分数据集的代码,对原始ORL数据集每个类别的样本打乱,按照预先设定的proportion比例划分训练集和验证集。 - 划分完成后将生成两个文件夹:
- 通过简单的编码方式对不同类别的不同图像进行命名,后续通过简单的解码即可加载数据集。 数据划分之后的训练集图像样例如下:
- 划分完成后,需要将数据读入内存以输入算法进行计算。如下图所示,分别为训练集、验证集的图像和标签定义数组。注释中展示了各数组的维度:
- 数据预处理
在将数据输入KNN算法前,需要将数据进行归一化处理。使用极差法,如下图代码所示。 - 为了避免二维图像展平成一维向量时引起的维度灾难问题,可以先对原特征进行降维,再利用KNN算法进行分类,常用降维方法有PCA。
- WK-NNC分类
传统KNN算法对K个样本的权重相同,然而对于度量距离更近的样本,往往更倾向于是同类样本,基于此可以改进传统KNN算法,将距离待测样本更近的样本赋予更大的权重。 - 将待测样本与所有训练集的度量距离进行升序排序,选择最邻近K个样本的距离并计算其权重,同时记录其数组索引。最后让K个最邻近带权样本投票,选择投票得分最高的类别即可得到待测样本的识别类别,代码如下:
- 当K=4且采用欧氏距离时,验证集(120张图)上准确率达到96.67%,程序运行结果如下:
- 对比实验
这一部分对不同的距离度量方法和不同K值进行对比实验,以选择合适的距离度量方法和K值。 - 四组对比实验不同K值的识别准确率曲线如下:
- 由验证集精度曲线可以看出,K取3或4的分类效果最好,且改进的WK-NNC算法效果比KNN算法效果更好,WK-NNC与曼哈顿距离组合的效果最好,精度达到了98.33%。
1.3 KNN算法的优势和劣势
优点:
- 思想简单,理论成熟,既可以做分类又可以做回归
- KNN的决策边界一般不是线性的,因此可以用于非线性分类任务
- 基本上无需训练,因此训练时间复杂度比SVM等算法低
缺点:
- 计算量大,对于每个待测样本均要与所有训练集计算距离,导致预测速度比逻辑回归等算法慢。且不适用于特征维度高的数据,引起维度灾难。
- 样本不均衡时,对稀有类别的预测准确率有所降低。
2 基于SVM的人脸识别
算法流程图如下:
2.1 SVM二分类算法描述
SVM的对偶算法有三类:
- 线性可分SVM,通过硬间隔最大化求解
- 近似线性可分SVM,通过软间隔最大化求解
- 非线性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 实验验证
- 定义变量
利用python的argsparse命令行解析标准模块,我们可以直接在命令行中向程序中传入参数并让程序运行。这里主要为了制作数据集文件,因此定义了原始ORL数据集路径和期望保存的数据集文件路径。 - 制作数据集文件
从原始ORL数据集路径下,利用Image图像处理库读取每类的每张图片,并将其从二维图像空间变换为一维向量,并在每个图像向量的最后一维添加该类的类别。将堆叠好的数据集保存在txt文件中。 - 生成的数据集文件:
- 读数数据集、归一化处理、划分数据集
从生成的数据集文件中读取图像向量和标签,并对数据集进行归一化处理,归一化的方法为极差法: - 将读取到的数据集按照7:3的比例随机划分为训练集和验证集。
- PCA降维、训练SVM模型
由于图像向量维度为92×102=10304,直接输入SVM进行训练会造成维数灾难,导致训练过程很慢,而PCA算法可以将数据降维,同时保存数据的主要信息,因此,我们对训练集拟合一个PCA模型,从而将图像向量降维。降维后的训练集直接输入SVM模型进行训练。 - 对比实验
用训练集拟合的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效果的主要因素有:
- 核函数
采用linear核函数和rbf核函数效果较好,在验证集上的识别准确率最高均能达到99.17%,但需要选择合适的惩罚因子 。对于linear核函数, 取值较小;对于rbf核函数, 取值较大。 - PCA降维后的特征维度
对于linear和rbf核函数的SVM模型,增加PCA降维后的特征维度 ,识别效果均能得到提升,这是因为随着 的提升,保留了更多的数据原始信息,因此更有利于分类。 - 数据归一化
从第1、2和3、10以及23、26组实验可以看出,在训练SVM之前,对数据进行归一化处理也能提高模型识别准确率。
2.4 SVM算法的优势和劣势
优点:
- SVM理论基础比较完善,适用于数量少的样本。
- SVM可以利用内积核函数代替向高维空间的非线性映射,实现在更高维度上进行分类。
- 少数支持向量决定了最终结果,增删改非支持向量对模型没有影响,使得模型具有较好的鲁棒性。
缺点:
- SVM算法难以实施在大规模训练样本中。由于SVM是借助二次规划来求解支持向量的,而求解二次规划涉及m阶矩阵计算(m为样本个数)。因此随着m增大,计算内存开销和计算时间也会增大。
3 KNN算法与SVM算法对比
KNN | SVM |
基本原理是找到数据集中距离待测样本最近的K个值,再利用这K个值投票作为待测样本的预测结果 | 使用超平面来分割数据集 |
没有训练过程,但预测时需要计算待测样本与数据集中所有样本的距离,当训练集和测试集很大时,预测效率低 | 有训练过程,训练完直接得到分类超平面,分类结果仅由少数支持向量决定,且不再需要训练集数据,因此预测效率高 |
存在维数灾难问题,KNN基于距离进行分类,当维度增大时,单位距离内的样本点会减少,导致需要更远的距离才能找到临近点 | SVM通过非线性映射,将样本映射到高维特征空间,使得样本在高维空间线性可分,而使用核函数几乎不增加计算复杂性,从而在一定程度上避免了维数灾难问题 |