Recuperação de Sinal Esparso com Perseguição Ortogonal de Correspondência

Beginner

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

Introdução

A Perseguição de Correspondência Ortogonal (OMP) é um método para recuperar um sinal esparso a partir de uma medição ruidosa codificada com um dicionário. Neste laboratório, utilizaremos o scikit-learn para implementar OMP e recuperar um sinal esparso a partir de uma medição ruidosa.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. 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.

Importar Bibliotecas

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import OrthogonalMatchingPursuit
from sklearn.linear_model import OrthogonalMatchingPursuitCV
from sklearn.datasets import make_sparse_coded_signal

Gerar os Dados

n_components, n_features = 512, 100
n_nonzero_coefs = 17

## gerar os dados

## y = Xw
## |x|_0 = n_nonzero_coefs

y, X, w = make_sparse_coded_signal(
    n_samples=1,
    n_components=n_components,
    n_features=n_features,
    n_nonzero_coefs=n_nonzero_coefs,
    random_state=0,
)
X = X.T

(idx,) = w.nonzero()

## distorcer o sinal limpo
y_noisy = y + 0.05 * np.random.randn(len(y))

Plotar o Sinal Raro

plt.figure(figsize=(7, 7))
plt.subplot(4, 1, 1)
plt.xlim(0, 512)
plt.title("Sinal Raro")
plt.stem(idx, w[idx])

Plotar a Reconstrução Livre de Ruído

omp = OrthogonalMatchingPursuit(n_nonzero_coefs=n_nonzero_coefs)
omp.fit(X, y)
coef = omp.coef_
(idx_r,) = coef.nonzero()
plt.subplot(4, 1, 2)
plt.xlim(0, 512)
plt.title("Sinal Recuperado a partir de Medidas Livres de Ruído")
plt.stem(idx_r, coef[idx_r])

Plotar a Reconstrução com Ruído

omp.fit(X, y_noisy)
coef = omp.coef_
(idx_r,) = coef.nonzero()
plt.subplot(4, 1, 3)
plt.xlim(0, 512)
plt.title("Sinal Recuperado a partir de Medidas com Ruído")
plt.stem(idx_r, coef[idx_r])

Plotar a Reconstrução com Ruído com Número de Não-Zeros Definido por Validação Cruzada

omp_cv = OrthogonalMatchingPursuitCV()
omp_cv.fit(X, y_noisy)
coef = omp_cv.coef_
(idx_r,) = coef.nonzero()
plt.subplot(4, 1, 4)
plt.xlim(0, 512)
plt.title("Sinal Recuperado a partir de Medidas com Ruído com Validação Cruzada")
plt.stem(idx_r, coef[idx_r])

plt.subplots_adjust(0.06, 0.04, 0.94, 0.90, 0.20, 0.38)
plt.suptitle("Recuperação de Sinal Esparso com Perseguição Ortogonal de Correspondência", fontsize=16)
plt.show()

Resumo

Neste laboratório, aprendemos como utilizar a Perseguição Ortogonal de Correspondência (OMP) para recuperar um sinal esparso a partir de uma medida ruidosa codificada com um dicionário. Usamos a biblioteca scikit-learn para implementar a OMP e gerar um sinal codificado esparso. Também plotamos o sinal esparso, a reconstrução sem ruído, a reconstrução com ruído e a reconstrução com ruído e o número de não-zeros definido por validação cruzada.