使用核主成分分析进行图像去噪

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验演示了如何使用核主成分分析(Kernel PCA)对图像进行去噪。其思路是在无噪声图像上学习主成分分析(PCA)基,并使用该基对噪声图像进行重构和去噪。为此,我们使用美国邮政服务(USPS)数字数据集。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/preprocessing -.-> lab-49108{{"使用核主成分分析进行图像去噪"}} sklearn/model_selection -.-> lab-49108{{"使用核主成分分析进行图像去噪"}} sklearn/decomposition -.-> lab-49108{{"使用核主成分分析进行图像去噪"}} sklearn/datasets -.-> lab-49108{{"使用核主成分分析进行图像去噪"}} ml/sklearn -.-> lab-49108{{"使用核主成分分析进行图像去噪"}} end

通过 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_componentsgammaalpha 的合适值时,我们需要谨慎。