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.
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.