LoginSignup
14
12

More than 5 years have passed since last update.

辞書学習アルゴリズム

Last updated at Posted at 2016-12-11

スパースモデリング第12章の辞書学習アルゴリズムをjupyter notebookで実装した。jupyter notebookへのリンク

結果

Barbaraから8x8のパッチ約25000個を抽出し、辞書学習を行った。

barbara_patches.png

初期値とした2次元分離可能DCT辞書
dct_dictionary.png
K-SVD法でパッチから学習した辞書
ksvd_dictionary_barbara.png

辞書学習によりスパース表現誤差が減少した。

Barbara_K-SVD.png

K-SVDアルゴリズム

  • 信号事例$Y:n \times M$(nは信号の次元、Mは事例数)
  • スパース表現$X:m \times M$(mはスパース表現ベクトルの次元)
  • 辞書$A:n \times m$

$k_0$個の要素のみが非ゼロの$x_i$で$y_i$をスパース表現する。

タスク:

\min_{A,\{x_i\}^{M}_{1}} \Sigma_{i=1}^{M} ||y_i-Ax_i|| \text{ subject to } ||x_{i}||_0 \leq k_{0}, 1 \leq i \leq M

初期化:

$k=0$として

  • 初期辞書:まず8×11の1次元DCT行列$A_{1D}$を作成した。$k$番目のアトム$(k=1,2,\dots,11)$は、

$a^{1D}_{k}=\cos((i-1)(k-1)\pi/11),(i=1,2,\dots,8)$

である。最初のアトム以外は平均を引き去り、クロネッカー積

$A_{2D} = A_{1D} \otimes A_{1D}$

を用いて初期辞書を生成した。

  • 正規化:$A$の列を正規化

メインループ:

$k \leftarrow k+1$として、以下のステップを実行する。

  • スパース符号化:追跡アルゴリズムを用いて、以下の解を近似する。
\hat{x_{i}} = \arg \min_{x} ||y_{i} - Ax||_{2}^{2} \text{ subject to } ||x||_{0} \leq k_{0}

そして、$1 \leq i \leq M$についてスパース表現ベクトル$\hat{x}_{i}$を得る。これらを用いて行列$X$を構築する。

  • K-SVD辞書更新:以下の手順により、辞書の列を更新し、$A$を得る。   $j_0=1,2,\dots,m$について反復する。
  1. アトム$a_{j_{0}}$を用いる事例集合を定義する。$$ \Omega_{j_{0}} = \{ i|1 \leq i \leq M, X[j_{0}, i] \neq 0 \}$$

  2. 残差行列を計算する。$$ E_{j_{0}} = Y - \Sigma_{j \neq j_{0}} a_{j}x_{j}^{T} $$

  3. $E_{j_{0}}$から $\Omega_{j_{0}}$に対応する列だけをとりだし$E_{j_{0}}^{R}$とする。

  4. $SVD$を適用し、$E_{j_{0}}^{R} = U \Delta V$とする。そして辞書のアトム$a_{j_{0}} = u_{1}$、その表現ベクトルを$x_{j_{0}}^{R}=\Delta[1, 1]v_{1}^{T}$として更新する。

  • 停止条件:もし$||Y - AX||^{2}_{F}$の変化が十分に小さければ終了し、そうでなければ反復する。

出力:

結果$A$を得る。

参考

14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12