在图像处理领域,去噪是一个重要的任务,它旨在从含有噪声的图像中恢复出原始的、清晰的图像。本文将介绍如何利用主成分分析(PCA)和核PCA(Kernel PCA)对USPS数字数据集中的图像进行去噪和重建。将通过比较PCA和核PCA的结果,来展示它们在去噪和图像重建方面的效果。
首先,需要加载USPS数字数据集。这个数据集可以通过OpenML平台获取。为了使像素值位于(0, 1)的范围内,使用MinMaxScaler对数据进行了归一化处理。
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 加载数据集
X, y = fetch_openml(data_id=41082, as_frame=False, return_X_y=True)
# 数据归一化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
接下来,将数据集分为训练集和测试集,其中训练集包含1000个样本,测试集包含100个样本。这些图像是无噪声的,将用它们来评估去噪方法的有效性。此外,还在原始数据集的副本上添加了高斯噪声,以模拟实际的噪声情况。
将在有噪声的图像上学习PCA基和核PCA基,然后使用这些模型来重建和去噪图像。这里,使用线性PCA和使用径向基函数(RBF)核的核PCA。
from sklearn.decomposition import PCA, KernelPCA
# 初始化PCA和核PCA模型
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中丢弃解释方差最小的组件,希望能够去除噪声。在核PCA中,期望得到更好的重建效果,因为使用非线性核来学习PCA基和映射函数。
将使用均方误差(MSE)来定量评估图像重建的效果。首先,通过绘制测试图像来定性地评估图像重建。
import matplotlib.pyplot as plt
def plot_digits(X, title):
""“辅助函数,用于绘制100个数字。”""
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"有噪声测试图像\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}")
接下来,使用PCA和核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重建\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}")
plot_digits(X_reconstructed_kernel_pca, f"核PCA重建\nMSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}")
从结果可以看出,PCA的MSE值低于核PCA,但从定性分析来看,核PCA在去除背景噪声和提供更平滑的图像方面可能更胜一筹。然而,需要注意的是,核PCA的去噪效果将取决于参数n_components、gamma和alpha的选择。