Introdução
Este laboratório demonstra como usar a PCA do Kernel para remover ruído de imagens. A ideia é aprender uma base PCA em imagens sem ruído e usá-la para reconstruir e remover o ruído das imagens com ruído. Usamos o conjunto de dados de dígitos USPS para este propósito.
Dicas da Máquina Virtual
Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.
Às vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.
Carregar o conjunto de dados através do OpenML
Carregamos o conjunto de dados de dígitos USPS usando a função fetch_openml() do scikit-learn. Os dados são então normalizados usando 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)
Criar Conjuntos de Treino e Teste
Dividimos o conjunto de dados em um conjunto de treino com 1000 amostras e um conjunto de teste com 100 amostras. Adicionamos ruído Gaussiano ao conjunto de teste e criamos duas cópias dos dados originais; uma com ruído e outra sem ruído.
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
Plotar Imagens de Teste
Definimos uma função auxiliar para plotar as imagens de teste. Usamos esta função para plotar as imagens de teste não corrompidas e ruidosas.
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, "Imagens de teste não corrompidas")
plot_digits(
X_test_noisy, f"Imagens de teste ruidosas\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)
Aprender a Base PCA
Aprendemos a base PCA usando PCA linear e PCA de kernel. O PCA de kernel utiliza o kernel de função de base radial (RBF) para aprender a 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 e Desruir Ruído em Imagens de Teste
Transformamos e reconstruímos o conjunto de teste ruidoso usando PCA e PCA de kernel. Em seguida, plotamos as imagens reconstruídas para comparar os 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, "Imagens de teste não corrompidas")
plot_digits(
X_reconstructed_pca,
f"Reconstrução PCA\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
X_reconstructed_kernel_pca,
(
"Reconstrução PCA de Kernel\n"
f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
),
)
Resumo
Neste laboratório, aprendemos a utilizar o PCA de Kernel para remover ruído de imagens. Utilizamos o conjunto de dados de dígitos USPS para demonstrar o processo. Aprendemos uma base PCA em imagens sem ruído e a utilizamos para reconstruir e remover o ruído das imagens ruidosas. Comparámos os resultados do PCA linear e do PCA de kernel, e verificámos que o PCA de kernel é mais eficiente na remoção de ruído de fundo e na produção de imagens mais suaves. No entanto, precisamos de ter cuidado na seleção dos valores apropriados para n_components, gamma e alpha.