简介
本实验演示了如何使用核主成分分析(Kernel PCA)对图像进行去噪。其思路是在无噪声图像上学习主成分分析(PCA)基,并使用该基对噪声图像进行重构和去噪。为此,我们使用美国邮政服务(USPS)数字数据集。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
通过 OpenML 加载数据集
我们使用 scikit-learn 中的 fetch_openml() 函数加载美国邮政服务(USPS)数字数据集。然后使用 MinMaxScaler() 对数据进行归一化处理。
import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
X, y = fetch_openml(data_id=41082, as_frame=False, return_X_y=True, parser="pandas")
X = MinMaxScaler().fit_transform(X)
创建训练集和测试集
我们将数据集拆分为一个包含 1000 个样本的训练集和一个包含 100 个样本的测试集。我们向测试集中添加高斯噪声,并创建原始数据的两个副本:一个有噪声,一个无噪声。
X_train, X_test, y_train, y_test = train_test_split(
X, y, stratify=y, random_state=0, train_size=1_000, test_size=100
)
rng = np.random.RandomState(0)
noise = rng.normal(scale=0.25, size=X_test.shape)
X_test_noisy = X_test + noise
noise = rng.normal(scale=0.25, size=X_train.shape)
X_train_noisy = X_train + noise
绘制测试图像
我们定义一个辅助函数来绘制测试图像。我们使用这个函数来绘制未损坏的和有噪声的测试图像。
import matplotlib.pyplot as plt
def plot_digits(X, title):
fig, axs = plt.subplots(nrows=10, ncols=10, figsize=(8, 8))
for img, ax in zip(X, axs.ravel()):
ax.imshow(img.reshape((16, 16)), cmap="Greys")
ax.axis("off")
fig.suptitle(title, fontsize=24)
plot_digits(X_test, "未损坏的测试图像")
plot_digits(
X_test_noisy, f"有噪声的测试图像\n均方误差(MSE):{np.mean((X_test - X_test_noisy) ** 2):.2f}"
)
学习主成分分析(PCA)基
我们使用线性主成分分析(PCA)和核主成分分析(Kernel PCA)来学习主成分分析基。核主成分分析使用径向基函数(RBF)核来学习基。
from sklearn.decomposition import PCA, KernelPCA
pca = PCA(n_components=32, random_state=42)
kernel_pca = KernelPCA(
n_components=400,
kernel="rbf",
gamma=1e-3,
fit_inverse_transform=True,
alpha=5e-3,
random_state=42,
)
pca.fit(X_train_noisy)
_ = kernel_pca.fit(X_train_noisy)
重建并去噪测试图像
我们使用主成分分析(PCA)和核主成分分析(Kernel PCA)对有噪声的测试集进行变换和重建。然后我们绘制重建后的图像以比较结果。
X_reconstructed_kernel_pca = kernel_pca.inverse_transform(
kernel_pca.transform(X_test_noisy)
)
X_reconstructed_pca = pca.inverse_transform(pca.transform(X_test_noisy))
plot_digits(X_test, "未损坏的测试图像")
plot_digits(
X_reconstructed_pca,
f"PCA 重建\n均方误差(MSE):{np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
X_reconstructed_kernel_pca,
(
"核主成分分析重建\n"
f"均方误差(MSE):{np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
),
)
总结
在本实验中,我们学习了如何使用核主成分分析(Kernel PCA)对图像进行去噪。我们使用美国邮政服务(USPS)数字数据集来演示这一过程。我们在无噪声图像上学习了主成分分析基,并使用它来重建和去噪有噪声的图像。我们比较了线性主成分分析(PCA)和核主成分分析的结果,发现核主成分分析在去除背景噪声和提供更平滑图像方面更有效。然而,在选择 n_components、gamma 和 alpha 的合适值时,我们需要谨慎。