题目要求
采用PCA算法对数据进行降维。
步骤
- 利用PCA对人脸进行降维,从1024维降到100维:
(1) 均值归一化。 计算出每一维特征的均值𝜇𝑗 ,令 𝑥𝑗 = 𝑥𝑗 − 𝜇𝑗。如果特征是在不同的数量级上,还需要将其除以标准差。
(2) 计算协方差矩阵(covariance matrix)𝛴。 ∑ = 1/𝑚 ∑𝑖=1𝑛 𝑋𝑇𝑋,X中每一行是一个样本; m是样本数;X的大小是mn; ∑ 的大小是nn。
(3) 计算协方差矩阵𝜮的特征向量。 使用SVD分解:∑ = 𝑼𝑺𝑽T,直接使用如下代码:U, sigma, VT=np.linalg.svd(data)
(4) 计算出主成分。
(5) 将数据投影到主成分方向。 𝒛 (𝒊) = 𝑼𝒓𝒆𝒅𝒖𝒄𝒆 𝑻 ∗ 𝒙 (𝒊),注意:此处的 𝒙(𝒊) 是均值归一化后的。 - 进行数据恢复,观察仅使用前100维主成分恢复得到的人脸图像。
数据集
链接:ex7faces.mat
提取码:mjy7
PCA
主成分分析用于数据降维。
实验过程
原始的人脸大小32×32=1024维,一行数据是一个人脸, 将数据reshape成32×32,显示人脸图像其中的前100张人脸图:
显示其单通道的灰度图看看:
将其降到100维后再次复原,复原图像如下图所示。可以看到即使仅仅保留了100个特征,但是图像的大致信息都保留了下来,尽管变得“模糊”了,但是人脸的主要信息没有丢失,丢失的是图像中的一些很细节的东西,降维后并没有对我们识别人脸产生重大影响,但是数据量却减少了很多,能够大大降低计算开销。
展示其单通道的灰度图:
Python实现
import numpy as np
from scipy.io import loadmat
import matplotlib.pyplot