目录
1.PCA简介
1.1 PCA基本步骤
主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。
PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。
数据中心化
计算协方差矩阵
计算特征值和特征向量
选择主成分
数据投影
1.2 PCA原理
PCA的详细原理涉及线性代数、协方差矩阵、特征值分解等概念。
1.数据中心化
假设有m个n维数据点,构成一个m×n的矩阵X。首先,计算每个特征的均值,然后将每个数据点都减去对应特征的均值,从而实现数据中心化。
中心化后的数据矩阵:
2.计算协方差矩阵
协方差矩阵反映了不同特征之间的线性关系。协方差矩阵C的元素Cij表示第i个特征和第j个特征之间的协方差。
3.特征值分解
对协方差矩阵C进行特征值分解。得到特征值(eigenvalues)λ和对应的特征向量(eigenvectors)V。
其中,V的每一列是一个特征向量,Lambda 是一个对角矩阵,对角线上的元素是特征值。
4.选择主成分
将特征值按降序排列,选择前k个特征值对应的特征向量作为主成分。这k个特征向量构成了一个投影矩阵P。
5.数据投影
用投影矩阵P将中心化后的数据矩阵X映射到新的特征空间,得到降维后的数据矩阵Z。
PCA的核心思想是通过特征值分解,找到数据中最重要的主成分方向。这些主成分方向对应于协方差矩阵的特征向量,而特征值表示了在这些方向上的数据变化的大小。
PCA的目标是选择最能表达原始数据方差的方向,以便在保留重要信息的同时实现降维。选择的主成分数(k值)通常是一个由实际问题和计算资源决定的超参数。
2.照片要求
30个人,每人拍摄10张正脸照片,取每个人的7张照片,共210张作为训练数据。那么每个人剩下的3张照片,计算机还没有看过,就可以在计算机认识了每一个人之后用来考研计算机是否真的能够正确识别图像中的人是谁。
这是我创造的30个人的训练集文件,每个trainxx 下又包含7张照片。
这是我创造的30个人的测试集文件,每个testxx 下又包含3张照片。
3.创建训练人脸库的特征脸空间
3.1 创建所有训练样本组成的 M×N 矩阵
创建所有训练样本组成的 M×N 矩阵 trainFaceMat。M 为样本个数,N 为一 个训练样本 图像所有像素按行相连的像素值,在本次实验中, M = 人数(使用的30个人的人脸数据) * 7(每人7张照片)= 210。
N = 像素点的个数,比如说一张照片大小为 10 * 10, N就为100。在本次实验中,我们把每个人的照片都处理成128 * 128,因此N = 16384。
# 对于每一张照片,首先创建一个列表list,存储本张照片的16384个灰度值,
# 当一个list存储完16384个灰度值后,将list添加至bigList。
# 依次循环210次, bigList就存储了210张照片的灰度值了。
'''
注:这里有一处细节,就是我是在读入每一张照片时,是新创建的列表list。
而不是在最开始创建list,然后每次读入照片时使用.clear()清空list。
这里涉及到Python中浅复制的知识,是因为bigList使用append的时候,
是浅复制的状态,如果之后对列表list操作bigList也会被修改,这样的话
最后bigList存储的全为最后一张照片的灰度值。
'''
# 最后使用numpy中的函数,将列表bigList转换为矩阵。
bigList = []
# 导入人脸模型库
faceCascade = cv2.CascadeClassifier(r'C:\Python\haarshare\haarcascade_frontalface_alt.xml')
# 遍历30个人
for i in range(1, 31):
# 遍历每个