LoginSignup
2
5

More than 5 years have passed since last update.

Nonnegative Matrix Factorization (NMF) の解を求めるアルゴリズムの導出

Posted at

$\boldsymbol{V} \in \mathbb{R}^{m \times n}$を入力とし,これを$\boldsymbol{V} \approx \boldsymbol{W} \boldsymbol{H}^T$と分解することを目的とする.ただし,$\boldsymbol{W} \in \mathbb{R}^{m \times k}$, $\boldsymbol{H} \in \mathbb{R}^{n \times k}$とする.なお,今回は単純のため,正則化は考えない.拡張は難しくない(はず).

さて,解きたい最適化問題は以下で与えられる.

\begin{align*}
\min_{\boldsymbol{W}, \boldsymbol{H}} &\ \left\|\boldsymbol{V} - \boldsymbol{W}\boldsymbol{H}^T \right\|^2_{F} \\
s.t. &\ \boldsymbol{W} \succeq \boldsymbol{0} \\
&\ \boldsymbol{H} \succeq \boldsymbol{0} \\
\end{align*}

なお,今回はFrobeniusで行列間の距離を考えるが,他の指標でも構わない(KL Divergenceとか).Lagrangianは以下のようになる.

\begin{align*}
L(\boldsymbol{W}, \boldsymbol{H}, \boldsymbol{A}, \boldsymbol{B})
&= \left\|\boldsymbol{V} - \boldsymbol{W}\boldsymbol{H}^T \right\|^2_{F} - \sum_{i=1}^m \sum_{j=1}^k A_{ij} W_{ij} - \sum_{i=1}^n \sum_{j=1}^k B_{ij} H_{ij} \\
&= tr\left(\boldsymbol{H} \boldsymbol{W}^T \boldsymbol{W} \boldsymbol{H}^T\right) - 2 tr \left(\boldsymbol{V}^T \boldsymbol{W} \boldsymbol{H}^T\right)
- tr\left(\boldsymbol{W} \boldsymbol{A}^T\right) - tr\left(\boldsymbol{H} \boldsymbol{B}^T\right) + const.
\end{align*}

以下文章が適当になる.

KKT condition (Stationarity):

\begin{align}
\frac{\partial L}{\partial \boldsymbol{W}} = 0 &\Rightarrow 2 \boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H} - 2 \boldsymbol{V} \boldsymbol{H} - \boldsymbol{A} = 0 \cdots (1) \\
\frac{\partial L}{\partial \boldsymbol{H}} = 0 &\Rightarrow 2 \boldsymbol{H} \boldsymbol{W}^T \boldsymbol{W} - 2 \boldsymbol{V}^T \boldsymbol{W} - \boldsymbol{B} = 0 \cdots (2) \\
\end{align}

KKT condition (Complementary slackness):

\begin{align*}
-A_{ij}W_{ij} &= 0 \ (\forall i=1, \ldots, m \ \forall j=1, \ldots, k) \cdots (3)\\
A_{ij} &\geq 0 \ (\forall i=1, \ldots, m \ \forall j=1, \ldots, k) \cdots (4)\\
-B_{ij}H_{ij} &= 0 \ (\forall i=1, \ldots, n \ \forall j=1, \ldots, k) \cdots (5)\\
B_{ij} &\geq 0 \ (\forall i=1, \ldots, n \ \forall j=1, \ldots, k) \cdots (6)\\
\end{align*}
\begin{align*}
(1), (3) &\Rightarrow W_{ij} \left(\left[\boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H}\right]_{ij} - \left[\boldsymbol{V} \boldsymbol{H}\right]_{ij} \right) = 0
\Rightarrow W_{ij} = W_{ij} \frac{\left[\boldsymbol{V} \boldsymbol{H}\right]_{ij}}{\left[\boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H}\right]_{ij}} \cdots (7) \\
(2), (5) &\Rightarrow H_{ij} \left( \left[\boldsymbol{H} \boldsymbol{W}^T \boldsymbol{W}\right]_{ij} - \left[\boldsymbol{V}^T \boldsymbol{W}\right]_{ij} \right)= 0
\Rightarrow H_{ij} = H_{ij} \frac{\left[\boldsymbol{V}^T \boldsymbol{W}\right]_{ij}}{\left[\boldsymbol{H} \boldsymbol{W}^T \boldsymbol{W}\right]_{ij}} \cdots (8)
\end{align*}

(7), (8)から解は右辺の関数のfixed pointであることがわかる.なので,以下の更新式(fixed point iteration)で解を求めることができる.

\begin{align*}
W_{ij} \leftarrow W_{ij} \frac{\left[\boldsymbol{V} \boldsymbol{H}\right]_{ij}}{\left[\boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H}\right]_{ij}} \\
H_{ij} \leftarrow H_{ij} \frac{\left[\boldsymbol{V}^T \boldsymbol{W}\right]_{ij}}{\left[\boldsymbol{H} \boldsymbol{W}^T \boldsymbol{W}\right]_{ij}}
\end{align*}

ちなみに,

W_{ij} \leftarrow W_{ij} - \epsilon_{ij} \left(\left[\boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H}\right]_{ij} - \left[\boldsymbol{V} \boldsymbol{H}\right]_{ij}\right)

がGradient descentなわけですが,

\epsilon_{ij} = \frac{W_{ij}}{\left[\boldsymbol{W} \boldsymbol{H}^T \boldsymbol{H}\right]_{ij}}

とおくと,fixed point iterationは,adaptive stepsizeを用いた,Gradient descentだと見ることもできる.$\boldsymbol{H}$も同様.

2
5
0

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
2
5