对于MNIST数据集,首先把矩阵灰度图像输入转化为向量输入。针对“0”和“1”这两一类各自前1000个训练样本组成的样本集合(共2000个样本),利用PCA()函数,进行PCA分解。利用PCA()函数的fit_transform方法,获得每个样本在前三个PC方向上的分量。这时每个样本由三个PC分量组成的向量表示,称这个向量为该样本的“PC1-3特征”。你将得到2000个三维的“PC1-3特征”。以PC1为横轴,PC2为纵轴,考虑“PC1-3特征”的前两维,在PC1和PC2构成的二维空间中画出所有2000个样本的散点图。之后在PC1-PC3,PC2-PC3构成的空间中重复上述工作。
时间: 2024-02-03 12:15:47 浏览: 66
好的,这个任务需要使用Python和一些机器学习库来完成。首先,我们需要导入必要的库:numpy, matplotlib, sklearn 中的 PCA。
接下来,我们需要读取 MNIST 数据集中的前 1000 个“0”和“1”样本,并将图像数据转换为向量形式。我们可以使用以下代码来实现:
```python
from sklearn.datasets import fetch_openml
import numpy as np
mnist = fetch_openml('mnist_784')
X = mnist.data.astype('float64')
y = mnist.target.astype('int64')
# 只保留数字0和1的数据
X = X[(y == 0) | (y == 1)]
y = y[(y == 0) | (y == 1)]
# 将图像数据转换为向量形式
X = X.reshape(X.shape[0], -1)
```
接下来,我们可以使用 PCA() 函数进行 PCA 分解。我们可以设置 n_components 参数为 3,以获得每个样本在前三个 PC 方向上的分量。然后,我们可以使用 fit_transform() 方法来获得每个样本在前三个 PC 方向上的分量。
```python
from sklearn.decomposition import PCA
# 使用PCA进行降维
pca = PCA(n_components=3)
X_pca = pca.fit_transform(X)
# 将每个样本的前3个PC分量组成的向量作为该样本的“PC1-3特征”
X_pc = X_pca[:, :3]
```
现在,我们已经得到了每个样本在前三个 PC 方向上的分量,以及每个样本的“PC1-3特征”。
接下来,我们可以使用 matplotlib 库来将这些样本在 PC1-PC2,PC1-PC3 和 PC2-PC3 构成的二维空间中画出散点图。
```python
import matplotlib.pyplot as plt
# 将样本在PC1-PC2上的投影画出来
plt.scatter(X_pc[:, 0], X_pc[:, 1], c=y, cmap='viridis')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
# 将样本在PC1-PC3上的投影画出来
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_pc[:, 0], X_pc[:, 2], X_pc[:, 1], c=y, cmap='viridis')
ax.set_xlabel('PC1')
ax.set_ylabel('PC3')
ax.set_zlabel('PC2')
plt.show()
# 将样本在PC2-PC3上的投影画出来
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_pc[:, 1], X_pc[:, 2], X_pc[:, 0], c=y, cmap='viridis')
ax.set_xlabel('PC2')
ax.set_ylabel('PC3')
ax.set_zlabel('PC1')
plt.show()
```
这些图形显示了每个样本在前三个 PC 方向上的分布情况。可以看到,数字“0”和“1”在 PC1-PC2,PC1-PC3 和 PC2-PC3 构成的空间中有明显的分离。
阅读全文