使用正交匹配追踪进行稀疏信号恢复

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

正交匹配追踪(Orthogonal Matching Pursuit,OMP)是一种从用字典编码的噪声测量中恢复稀疏信号的方法。在本实验中,我们将使用scikit-learn实现OMP,以便从噪声测量中恢复稀疏信号。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49232{{"使用正交匹配追踪进行稀疏信号恢复"}} sklearn/datasets -.-> lab-49232{{"使用正交匹配追踪进行稀疏信号恢复"}} ml/sklearn -.-> lab-49232{{"使用正交匹配追踪进行稀疏信号恢复"}} end

导入库

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

生成数据

n_components, n_features = 512, 100
n_nonzero_coefs = 17

## 生成数据

## 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()

## 对纯净信号添加噪声
y_noisy = y + 0.05 * np.random.randn(len(y))

绘制稀疏信号

plt.figure(figsize=(7, 7))
plt.subplot(4, 1, 1)
plt.xlim(0, 512)
plt.title("稀疏信号")
plt.stem(idx, w[idx])

绘制无噪声重构结果

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("从无噪声测量中恢复的信号")
plt.stem(idx_r, coef[idx_r])

绘制有噪声重构结果

omp.fit(X, y_noisy)
coef = omp.coef_
(idx_r,) = coef.nonzero()
plt.subplot(4, 1, 3)
plt.xlim(0, 512)
plt.title("从有噪声测量中恢复的信号")
plt.stem(idx_r, coef[idx_r])

绘制通过交叉验证设置非零值数量的有噪声重构结果

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("通过交叉验证从有噪声测量中恢复的信号")
plt.stem(idx_r, coef[idx_r])

plt.subplots_adjust(0.06, 0.04, 0.94, 0.90, 0.20, 0.38)
plt.suptitle("使用正交匹配追踪的稀疏信号恢复", fontsize=16)
plt.show()

总结

在本实验中,我们学习了如何使用正交匹配追踪(OMP)从用字典编码的有噪声测量中恢复稀疏信号。我们使用了scikit-learn来实现OMP并生成稀疏编码信号。我们还绘制了稀疏信号、无噪声重构结果、有噪声重构结果以及通过交叉验证设置非零值数量的有噪声重构结果。