Dénuage d'images avec la PCA Kernel

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire montre comment utiliser la PCA Kernel pour débruiter des images. L'idée est d'apprendre une base PCA sur des images sans bruit et de l'utiliser pour reconstruire et débruiter les images bruitées. Nous utilisons l'ensemble de données de chiffres USPS à cette fin.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder au Notebook Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le Notebook Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du Notebook Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) 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/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{{"Dénuage d'images avec la PCA Kernel"}} sklearn/model_selection -.-> lab-49108{{"Dénuage d'images avec la PCA Kernel"}} sklearn/decomposition -.-> lab-49108{{"Dénuage d'images avec la PCA Kernel"}} sklearn/datasets -.-> lab-49108{{"Dénuage d'images avec la PCA Kernel"}} ml/sklearn -.-> lab-49108{{"Dénuage d'images avec la PCA Kernel"}} end

Charger l'ensemble de données via OpenML

Nous chargeons l'ensemble de données de chiffres USPS à l'aide de la fonction fetch_openml() de scikit-learn. Les données sont ensuite normalisées à l'aide de 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)

Créer des ensembles d'entraînement et de test

Nous divisons l'ensemble de données en un ensemble d'entraînement avec 1000 échantillons et un ensemble de test avec 100 échantillons. Nous ajoutons du bruit gaussien à l'ensemble de test et créons deux copies des données originales ; une avec du bruit et une sans bruit.

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

Tracer les images de test

Nous définissons une fonction d'aide pour tracer les images de test. Nous utilisons cette fonction pour tracer les images de test non corrompues et bruitées.

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, "Uncorrupted test images")
plot_digits(
    X_test_noisy, f"Noisy test images\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)

Apprendre la base PCA

Nous apprenons la base PCA à l'aide de la PCA linéaire et de la PCA Kernel. La PCA Kernel utilise le noyau de fonction de base radiale (RBF) pour apprendre la base.

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)

Reconstruire et débruiter les images de test

Nous transformons et reconstruisons l'ensemble de test bruité à l'aide de la PCA et de la PCA Kernel. Nous traçons ensuite les images reconstruites pour comparer les résultats.

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}"
    ),
)

Sommaire

Dans ce laboratoire, nous avons appris à utiliser la PCA Kernel pour débruiter des images. Nous avons utilisé l'ensemble de données de chiffres USPS pour démontrer le processus. Nous avons appris une base PCA sur des images sans bruit et l'avons utilisée pour reconstruire et débruiter les images bruitées. Nous avons comparé les résultats de la PCA linéaire et de la PCA Kernel et avons constaté que la PCA Kernel est plus efficace pour éliminer le bruit d'arrière-plan et fournir des images plus lisses. Cependant, nous devons faire attention lors de la sélection des valeurs appropriées pour n_components, gamma et alpha.