Bildentrauschung mit Kernel PCA

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab wird gezeigt, wie man Kernel PCA verwendet, um Bilder von Rauschen zu befreien. Die Idee besteht darin, eine PCA-Basis auf rauschenfreien Bildern zu lernen und diese zur Rekonstruktion und Entrauschung von rauschenden Bildern zu verwenden. Zu diesem Zweck verwenden wir den USPS-Ziffern-Datensatz.

Tipps für die VM

Nachdem der Start der VM abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Lade den Datensatz über OpenML

Wir laden den USPS-Ziffern-Datensatz mit der Funktion fetch_openml() aus scikit-learn. Die Daten werden anschließend mithilfe von MinMaxScaler() normalisiert.

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)

Erstelle Trainings- und Testsets

Wir teilen den Datensatz in einen Trainingssatz mit 1000 Proben und einen Testsatz mit 100 Proben auf. Wir fügen Gaussian-Rauschen (Gauß'sches Rauschen) zum Testsatz hinzu und erstellen zwei Kopien der ursprünglichen Daten; eine mit Rauschen und eine ohne Rauschen.

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

Zeichne Testbilder

Wir definieren eine Hilfsfunktion, um die Testbilder zu zeichnen. Wir verwenden diese Funktion, um die unversehrten und rauschenden Testbilder zu zeichnen.

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

Lerne die PCA-Basis

Wir lernen die PCA-Basis sowohl mit linearer PCA als auch mit Kernel PCA. Kernel PCA verwendet den radial basis function (RBF)-Kernel, um die Basis zu lernen.

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)

Rekonstruiere und entrausche Testbilder

Wir transformieren und rekonstruieren den rauschenden Testsatz sowohl mit PCA als auch mit Kernel PCA. Anschließend zeichnen wir die rekonstruierten Bilder, um die Ergebnisse zu vergleichen.

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

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Kernel PCA verwendet, um Bilder zu entrauschen. Wir haben den USPS-Ziffern-Datensatz verwendet, um den Prozess zu demonstrieren. Wir haben eine PCA-Basis auf rauschfreien Bildern gelernt und sie verwendet, um die rauschenden Bilder zu rekonstruieren und zu entrauschen. Wir haben die Ergebnisse von linearer PCA und Kernel PCA verglichen und festgestellt, dass Kernel PCA effizienter bei der Entfernung von Hintergrundrauschen und der Bereitstellung von glatteren Bildern ist. Wir müssen jedoch vorsichtig sein, wenn wir die passenden Werte für n_components, gamma und alpha auswählen.