特征向量如何表示特征脸?基于Python Olivetti数据集的PCA相关问题
归一化PCA特征向量转特征脸的方法
你拿到的归一化后数值在0.001量级的4096维特征向量,本身就是特征脸的原始数学表示,数值小是归一化的正常结果,不需要担心计算错误,转换为可直观展示的特征脸只需要两步操作:
- 维度重构:直接把长度为4096的特征向量按和你当初把64×64图像展平为一维向量时相同的排列规则(行优先/列优先),reshape为64×64的二维矩阵,这个矩阵就是特征脸的数值矩阵。
你观察到的数值量级小的原因很简单:向量做了模长为1的归一化,4096个元素的平方和为1,单个元素的平均绝对值必然在1/sqrt(4096) ≈ 0.015量级,如果PCA前做了像素均值中心化,部分正负值抵消后单元素数值还会更小,完全符合你观测到的0.001左右的结果。 - 可视化映射:原始特征向量的数值是相对于训练集均值的权重系数,不是直接的0-255灰度值,要显示为灰度图只需要做线性拉伸:将二维矩阵的最小值映射为0,最大值映射为255,转换为无符号8位整数格式即可。
对应的Python示例代码如下:
import numpy as np import matplotlib.pyplot as plt # eigenvec为你得到的单条归一化PCA特征向量,形状为(4096,) # 重构为64×64矩阵 eigenface_mat = eigenvec.reshape(64, 64) # 线性拉伸到0-255灰度范围 eigenface_vis = ((eigenface_mat - eigenface_mat.min()) / (eigenface_mat.max() - eigenface_mat.min()) * 255).astype(np.uint8) # 展示特征脸 plt.imshow(eigenface_vis, cmap="gray") plt.axis("off") plt.show()
- 补充说明:你使用20个训练样本得到的前10个特征向量,对应的特征脸依次表示训练集中人脸方差最大的前10种灰度分布模式,靠前的特征脸通常呈现整体的人脸明暗轮廓,靠后的特征脸会对应五官、姿态等更细节的差异特征,可视化后可以看到明显的模糊人脸结构。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

