Note

Go to the end to download the full example code. or to run this example in your browser via JupyterLite or Binder

Orthogonal Matching Pursuit#

Using orthogonal matching pursuit for recovering a sparse signal from a noisy measurement encoded with a dictionary

Sparse signal recovery with Orthogonal Matching Pursuit, Sparse signal, Recovered signal from noise-free measurements, Recovered signal from noisy measurements, Recovered signal from noisy measurements with CV
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
importmatplotlib.pyplotasplt
importnumpyasnp
fromsklearn.datasetsimport make_sparse_coded_signal
fromsklearn.linear_modelimport OrthogonalMatchingPursuit , OrthogonalMatchingPursuitCV
n_components, n_features = 512, 100
n_nonzero_coefs = 17
# generate the data
# 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()
# distort the clean signal
y_noisy = y + 0.05 * np.random.randn (len(y))
# plot the sparse signal
plt.figure (figsize=(7, 7))
plt.subplot (4, 1, 1)
plt.xlim (0, 512)
plt.title ("Sparse signal")
plt.stem (idx, w[idx])
# plot the noise-free reconstruction
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 ("Recovered signal from noise-free measurements")
plt.stem (idx_r, coef[idx_r])
# plot the noisy reconstruction
omp.fit(X, y_noisy)
coef = omp.coef_
(idx_r,) = coef.nonzero()
plt.subplot (4, 1, 3)
plt.xlim (0, 512)
plt.title ("Recovered signal from noisy measurements")
plt.stem (idx_r, coef[idx_r])
# plot the noisy reconstruction with number of non-zeros set by CV
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 ("Recovered signal from noisy measurements with CV")
plt.stem (idx_r, coef[idx_r])
plt.subplots_adjust (0.06, 0.04, 0.94, 0.90, 0.20, 0.38)
plt.suptitle ("Sparse signal recovery with Orthogonal Matching Pursuit", fontsize=16)
plt.show ()

Total running time of the script: (0 minutes 0.203 seconds)

Related examples

Blind source separation using FastICA

Blind source separation using FastICA

Feature agglomeration vs. univariate selection

Feature agglomeration vs. univariate selection

Joint feature selection with multi-task Lasso

Joint feature selection with multi-task Lasso

Plot multi-class SGD on the iris dataset

Plot multi-class SGD on the iris dataset

Gallery generated by Sphinx-Gallery