はじめに
直交マッチング追跡 (OMP: Orthogonal Matching Pursuit) は、辞書で符号化されたノイズ付き測定値から疎信号を回復するための手法です。この実験では、scikit-learn を使って OMP を実装し、ノイズ付き測定値から疎信号を回復します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
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 を実装し、疎符号化信号を生成しました。また、疎信号、ノイズのない再構成、ノイジーな再構成、および交差検定により非ゼロ数を設定したノイジーな再構成をプロットしました。