Deshacerse del ruido en imágenes con Kernel PCA

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar el Análisis de Componentes Principales Kernel (Kernel PCA) para eliminar el ruido de las imágenes. La idea es aprender una base PCA a partir de imágenes sin ruido y utilizarla para reconstruir y eliminar el ruido de las imágenes ruidosas. Para este propósito, utilizamos el conjunto de datos de dígitos USPS.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


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{{"Deshacerse del ruido en imágenes con Kernel PCA"}} sklearn/model_selection -.-> lab-49108{{"Deshacerse del ruido en imágenes con Kernel PCA"}} sklearn/decomposition -.-> lab-49108{{"Deshacerse del ruido en imágenes con Kernel PCA"}} sklearn/datasets -.-> lab-49108{{"Deshacerse del ruido en imágenes con Kernel PCA"}} ml/sklearn -.-> lab-49108{{"Deshacerse del ruido en imágenes con Kernel PCA"}} end

Cargar el conjunto de datos a través de OpenML

Cargamos el conjunto de datos de dígitos USPS utilizando la función fetch_openml() de scikit-learn. Los datos se normalizan luego utilizando 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)

Crear conjuntos de entrenamiento y prueba

Dividimos el conjunto de datos en un conjunto de entrenamiento con 1000 muestras y un conjunto de prueba con 100 muestras. Agregamos ruido gaussiano al conjunto de prueba y creamos dos copias de los datos originales; una con ruido y otra sin ruido.

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

Graficar imágenes de prueba

Definimos una función auxiliar para graficar las imágenes de prueba. Utilizamos esta función para graficar las imágenes de prueba sin ruido y con ruido.

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, "Imágenes de prueba sin ruido")
plot_digits(
    X_test_noisy, f"Imágenes de prueba con ruido\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)

Aprender la base de PCA

Aprendemos la base de PCA utilizando tanto PCA lineal como Kernel PCA. Kernel PCA utiliza el kernel de función de base radial (RBF) para aprender 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)

Reconstruir y deshacerse del ruido en las imágenes de prueba

Transformamos y reconstruimos el conjunto de prueba con ruido utilizando tanto PCA como Kernel PCA. Luego graficamos las imágenes reconstruidas para comparar los resultados.

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, "Imágenes de prueba sin ruido")
plot_digits(
    X_reconstructed_pca,
    f"Reconstrucción con PCA\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
    X_reconstructed_kernel_pca,
    (
        "Reconstrucción con Kernel PCA\n"
        f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
    ),
)

Resumen

En este laboratorio, aprendimos cómo utilizar Kernel PCA para eliminar el ruido de las imágenes. Utilizamos el conjunto de datos de dígitos USPS para demostrar el proceso. Aprendimos una base de PCA en imágenes sin ruido y la utilizamos para reconstruir y deshacernos del ruido en las imágenes ruidosas. Comparamos los resultados de PCA lineal y Kernel PCA y descubrimos que Kernel PCA es más eficiente para eliminar el ruido de fondo y proporcionar imágenes más suaves. Sin embargo, debemos tener cuidado al seleccionar los valores adecuados para n_components, gamma y alpha.