import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
# 加载MNIST数据集
mnist = fetch_openml('mnist_784')
X = mnist.data.astype('float32')
y = mnist.target.astype('int64')
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化PCA模型
pca = PCA()
# 对训练集进行PCA拟合
pca.fit(X_train)
# 绘制学习曲线
explained_variance = np.cumsum(pca.explained_variance_ratio_)
plt.plot(explained_variance)
plt.xlabel('Number of Components')
plt.ylabel('Explained Variance')
plt.title('Explained Variance vs. Number of Components')
plt.show()
# 缩小最佳维度的范围
# 这里我们假设我们的目标是保留90%的方差
n_components = np.argmax(explained_variance > 0.90) + 1
# 找出最佳维度
print(f"最佳维度: {n_components}")
# 使用最佳维度进行PCA转换
pca = PCA(n_components=n_components)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
# 重构出降维后的图像
X_reconstructed = pca.inverse_transform(X_train_pca)
# 可视化显示图像的压缩效果
n = 10 # 显示前10个样本的原始图像和重构图像
plt.figure(figsize=(20, 4))
for i in range(n):
# 原始图像
ax = plt.subplot(2, n, i + 1)
plt.imshow(X_train[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# 重构图像
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(X_reconstructed[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()