使用核 PCA 进行图像去噪#
此示例展示了如何使用 KernelPCA
对图像进行去噪。简而言之,我们利用在 fit
期间学习到的逼近函数来重建原始图像。
我们将使用 PCA
将结果与精确重建进行比较。
我们将使用 USPS 数字数据集来重现 [1] 第 4 节中介绍的内容。
参考文献
# Authors: Guillaume Lemaitre <[email protected]>
# Licence: BSD 3 clause
通过 OpenML 加载数据集#
USPS 数字数据集可在 OpenML 中找到。我们使用 fetch_openml
获取此数据集。此外,我们对数据集进行归一化,以便所有像素值都在 (0, 1) 范围内。
import numpy as np
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)
X = MinMaxScaler().fit_transform(X)
我们的想法是在噪声图像上学习 PCA 基(有核和无核),然后使用这些模型来重建和去噪这些图像。
因此,我们将数据集分为训练集和测试集,其中训练集包含 1,000 个样本,测试集包含 100 个样本。这些图像是无噪声的,我们将使用它们来评估去噪方法的效率。此外,我们创建原始数据集的副本并添加高斯噪声。
此应用程序的理念是表明我们可以通过在一些未损坏的图像上学习 PCA 基来对损坏的图像进行去噪。我们将同时使用 PCA 和基于核的 PCA 来解决这个问题。
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):
"""Small helper function to plot 100 digits."""
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)
此外,我们将使用均方误差 (MSE) 来定量评估图像重建。
让我们先来看看无噪声图像和噪声图像之间的区别。我们将在这方面检查测试集。
plot_digits(X_test, "Uncorrupted test images")
plot_digits(
X_test_noisy, f"Noisy test images\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)
学习 PCA
基#
我们现在可以使用线性 PCA 和使用径向基函数 (RBF) 核的核 PCA 来学习我们的 PCA 基。
重建和去噪测试图像#
现在,我们可以对噪声测试集进行变换和重建。由于我们使用的组件少于原始特征的数量,因此我们将获得原始集的近似值。事实上,通过删除 PCA 中解释方差最少的组件,我们希望消除噪声。核 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, "Uncorrupted test images")
plot_digits(
X_reconstructed_pca,
f"PCA reconstruction\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
X_reconstructed_kernel_pca,
(
"Kernel PCA reconstruction\n"
f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
),
)
PCA 的 MSE 低于核 PCA。但是,定性分析可能不会偏向于 PCA 而不是核 PCA。我们观察到核 PCA 能够去除背景噪声并提供更平滑的图像。
但是,应该注意的是,使用核 PCA 进行去噪的结果将取决于参数 n_components
、gamma
和 alpha
。
**脚本总运行时间:**(0 分 12.692 秒)
相关示例