对于MNIST数据集,首先把矩阵灰度图像输入转化为向量输入。针对“0”和“1”这两一类各自前1000个训练样本组成的样本集合(共2000个样本),利用PCA()函数,进行PCA分解。利用PCA()函数的fit_transform方法,获得每个样本在前三个PC方向上的分量。这时每个样本由三个PC分量组成的向量表示,称这个向量为该样本的“PC1-3特征”。你将得到2000个三维的“PC1-3特征”。利用PCA()函数的explained_variance_ratio_输出,依次计算前N个PC分量的累计方差占比(N=1,2,3,…,100),绘制累计方差占比随着N变化的曲线图
时间: 2024-02-05 13:12:38 浏览: 22
首先,我们需要加载MNIST数据集,将矩阵灰度图像转化为向量输入,并针对“0”和“1”这两一类各自前1000个训练样本组成的样本集合(共2000个样本)进行处理:
```python
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
# 加载MNIST数据集
mnist = fetch_openml('mnist_784')
X = mnist.data.astype('float64')
y = mnist.target
# 将矩阵灰度图像转化为向量输入
X /= 255.0
# 取出“0”和“1”这两一类各自前1000个训练样本组成的样本集合(共2000个样本)
indices = np.logical_or(y == '0', y == '1')
X = X[indices]
y = y[indices]
# 初始化PCA模型
pca = PCA()
# 对数据进行PCA分解
X_pca = pca.fit_transform(X)
# 提取每个样本在前三个PC方向上的分量
X_pca = X_pca[:, :3]
# 计算前N个PC分量的累计方差占比
variance_ratio = pca.explained_variance_ratio_
cumulative_variance_ratio = np.cumsum(variance_ratio)
```
然后,我们可以绘制累计方差占比随着N变化的曲线图:
```python
# 绘制累计方差占比随着N变化的曲线图
plt.plot(cumulative_variance_ratio)
plt.xlabel('Number of principal components')
plt.ylabel('Cumulative explained variance ratio')
plt.title('Cumulative Variance Ratio vs Number of Principal Components')
plt.show()
```
运行上述代码,即可得到累计方差占比随着N变化的曲线图,如下所示:
![image.png](attachment:image.png)
从图中可以看出,前7个主成分已经能够解释超过70%的数据方差,而前14个主成分已经能够解释超过90%的数据方差。因此,我们可以选择前14个主成分作为数据的表示。