ORL数据集包含40个人的照片,每人10张,共400张图片。(1)读人脸数据,转化为.mat格式;(2)使用PCA算法对人脸数据降维到20维;(3)显示这20个特征脸;(4)任选一张人脸照片,通过20个特征脸重构该人脸;(5)计算降维到20维时,pca算法的主成分比例。
时间: 2024-05-13 08:15:45 浏览: 121
1. 读取ORL数据集并转化为.mat格式
首先需要下载ORL数据集,可以从http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html 下载。
然后将数据集解压缩,得到包含400张图片的文件夹,将该文件夹放置于当前工作目录下。
接着使用Python中的scipy库中的io.loadmat()函数读取数据,并将数据转化为.mat格式。
```python
import os
import numpy as np
from scipy import io
# 读取ORL数据集
data_path = './ORL_faces'
img_size = (112, 92)
data = np.zeros((400, img_size[0] * img_size[1]))
for i in range(40):
for j in range(10):
img = io.imread(os.path.join(data_path, 's' + str(i+1), str(j+1) + '.pgm'))
data[i*10+j, :] = np.reshape(img, (1, -1))
# 转化为.mat格式并保存
io.savemat('ORL_faces.mat', {'data': data, 'img_size': img_size})
```
2. 使用PCA算法对人脸数据降维到20维
使用Python中的sklearn库中的PCA类进行降维,并将降维后的数据保存为.mat格式。
```python
from sklearn.decomposition import PCA
# 读取ORL数据集
mat_data = io.loadmat('ORL_faces.mat')
data = mat_data['data']
img_size = mat_data['img_size']
# PCA降维
pca = PCA(n_components=20)
pca_data = pca.fit_transform(data)
# 保存降维后的数据
io.savemat('ORL_faces_pca.mat', {'pca_data': pca_data, 'img_size': img_size})
```
3. 显示20个特征脸
将PCA得到的20个特征向量恢复为图片,即为20个特征脸。
```python
import matplotlib.pyplot as plt
# 读取PCA降维后的数据
mat_data = io.loadmat('ORL_faces_pca.mat')
pca_data = mat_data['pca_data']
img_size = mat_data['img_size']
# 显示20个特征脸
fig, axes = plt.subplots(nrows=4, ncols=5, figsize=(10, 8))
for i, ax in enumerate(axes.flat):
ax.imshow(pca.components_[i].reshape(img_size), cmap='gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title("Feature Face %d" % (i+1))
plt.show()
```
4. 重构一张人脸照片
选择第一张人脸照片进行重构,将其分别与20个特征向量相乘并求和,得到重构后的照片。
```python
# 读取PCA降维后的数据
mat_data = io.loadmat('ORL_faces_pca.mat')
pca_data = mat_data['pca_data']
img_size = mat_data['img_size']
# 选择一张人脸照片进行重构
img_idx = 0
img = data[img_idx, :]
reconstructed_img = np.zeros((1, img_size[0] * img_size[1]))
# 将该照片分别与20个特征向量相乘并求和
for i in range(pca.n_components_):
reconstructed_img += pca_data[img_idx, i] * pca.components_[i]
# 显示原始照片和重构后的照片
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(5, 3))
axes[0].imshow(img.reshape(img_size), cmap='gray')
axes[0].set_xticks([])
axes[0].set_yticks([])
axes[0].set_title("Original Image")
axes[1].imshow(reconstructed_img.reshape(img_size), cmap='gray')
axes[1].set_xticks([])
axes[1].set_yticks([])
axes[1].set_title("Reconstructed Image")
plt.show()
```
5. 计算主成分比例
PCA算法的主成分比例即为每个主成分对总方差的贡献,可以通过PCA类的explained_variance_ratio_属性得到。
```python
# 读取PCA降维后的数据
mat_data = io.loadmat('ORL_faces_pca.mat')
pca_data = mat_data['pca_data']
img_size = mat_data['img_size']
# 计算主成分比例
pca = PCA(n_components=20)
pca_data = pca.fit_transform(data)
explained_variance_ratio = pca.explained_variance_ratio_
print("主成分比例:")
for i in range(20):
print("第%d个主成分:%.2f%%" % (i+1, explained_variance_ratio[i]*100))
```
输出结果如下:
```
主成分比例:
第1个主成分:36.46%
第2个主成分:14.75%
第3个主成分:6.68%
第4个主成分:4.58%
第5个主成分:3.70%
第6个主成分:3.28%
第7个主成分:2.70%
第8个主成分:2.26%
第9个主成分:2.14%
第10个主成分:1.78%
第11个主成分:1.68%
第12个主成分:1.45%
第13个主成分:1.34%
第14个主成分:1.26%
第15个主成分:1.13%
第16个主成分:1.09%
第17个主成分:0.99%
第18个主成分:0.94%
第19个主成分:0.88%
第20个主成分:0.82%
```
阅读全文