PCA数据降维(Eigenfaces特征脸)

一、PCA基本原理

主成分分析(Principal Comonents Analysis, PCA)是多元统计分析中用来分析数据的一种方法,它是用一种较少数量的特征对样本进行描述以达到降低特征空间维数的方法。
对于一系列人脸图像samples的feature组成的多维向量,多维向量里的某些元素本身没有区分性,比如某个元素在所有的sample中都为1,或者与1差距不大,那么这个元素本身就没有区分性,用它做特征来区分,贡献会非常小。所以我们的目的是找那些变化大的元素,即方差大的那些维,而去除掉那些变化不大的维,从而使feature留下的都是最具有代表性的,而且计算量也变小了。
对于一个k维的feature来说,相当于它的每一维feature与其他维都是正交的(相当于在多维坐标系中,坐标轴都是垂直的),那么我们可以变化这些维的坐标系,从而使这个feature在某些维上方差大,而在某些维上方差很小。
PCA算法的目的正是为了求得一个k维特征的投影矩阵(变换矩阵)U,这个投影矩阵可以将高维向量X降到低维向量Y,并且仅仅损失一些次要信息,通过反变换可以基本重构出所对应的原始高维向量。新的低维特征必须每个维 都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。

二、人脸PCA降维(Eigenface)

设有N个人脸训练样本(如图 1),每个样本由其像素灰度值组成一个向量,则样本图像的像素点数即为的维数,M=width*height ,由向量构成的训练样本集为:
这里写图片描述
这里写图片描述
图1
该样本集的平均向量为:
这里写图片描述
平均向量又叫平均人脸(如图 2)
这里写图片描述
图2
样本集的协方差矩阵为:
这里写图片描述
求出协方差矩阵的特征向量这里写图片描述和对应的特征值这里写图片描述,这些特征向量组成的矩阵就是姿态空间的正交基底。将协方差矩阵的特征值按大到小排序:这里写图片描述。提取这里写图片描述大于这里写图片描述的对应的特征向量构成主成分,主成分构成的变换矩阵为:这里写图片描述
这样每一幅人脸图像都可以投影到这里写图片描述构成的特征脸子空间中,U的维数为这里写图片描述。有了这样一个降维的子空间,任何一幅人脸图像都可以向其作投影,即并获得一组坐标系数,即低维向量y(这里写图片描述)。Eg:取前3个特征向量,则第一幅人脸图像投影后的低维向量为
[1.68557690e+003 -3.64503899e+001 -2.02489771e+003],其反投影后的人脸图像如图 3所示
这里写图片描述
图3

作者:Jacky_Ponder,转载或分享请注明出处。QQ:2814152689

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2.1 加载 OlivettiFaces 人脸数据集 OlivettiFaces 数据集包含 400 张 64x64 像素的人脸图片,每张图片都属于 40 个人的一个人。这个数据集可以从 scikit-learn 库直接加载: ```python from sklearn.datasets import fetch_olivetti_faces faces = fetch_olivetti_faces() ``` 2.2 使用 PCA 对人脸进行降维特征脸提取 PCA(Principal Component Analysis)是一种常用的降维算法,可以把高维数据映射到低维空间。在人脸识别任务PCA 可以用来提取特征脸特征脸是指在训练数据集上通过 PCA 得到的一组基,这些基可以用来描述数据的大部分变化。对于每个像素位置,特征脸都有一个对应的权重,这些权重构成了一个向量,称为人脸的特征向量。 下面的代码使用 scikit-learn 库PCA 类对 OlivettiFaces 数据集进行降维特征脸提取: ```python from sklearn.decomposition import PCA # 将数据展平成二维数组 X = faces.data.reshape((400, -1)) # 创建 PCA 对象,并拟合数据 pca = PCA(n_components=100) pca.fit(X) # 提取特征脸 eigenfaces = pca.components_.reshape((100, 64, 64)) ``` 2.3 基于特征脸和平均脸的人脸重构 特征脸和平均脸可以用来重构人脸。具体来说,给定一个人脸图像,我们可以把它展平成一个向量,然后乘以特征脸的权重向量,再加上平均脸。这样就得到了一个新的向量,把它重新变成一个二维数组,就得到了重构后的图像。 下面的代码演示了如何使用特征脸和平均脸对人脸进行重构: ```python import matplotlib.pyplot as plt import numpy as np # 选择一张人脸图像作为示例 face_index = 0 example_face = X[face_index] # 计算该人脸图像的特征向量 weights = pca.transform([example_face])[0] # 计算重构后的图像 mean_face = pca.mean_ reconstructed_face = np.dot(weights, pca.components_) + mean_face # 将向量重新变成二维数组 reconstructed_face = reconstructed_face.reshape((64, 64)) # 显示原始图像和重构后的图像 fig, axes = plt.subplots(1, 2, figsize=(8, 4)) axes[0].imshow(example_face.reshape((64, 64)), cmap='gray') axes[0].set_title('Original Face') axes[1].imshow(reconstructed_face, cmap='gray') axes[1].set_title('Reconstructed Face') plt.show() ``` 运行以上代码,就可以看到原始图像和重构后的图像。可以发现,重构后的图像与原始图像非常相似,但是有一些细节上的差异。这些差异可能是由于 PCA 降维引入的信息损失造成的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值