*注意)この「べじぱみゅの学習メモ」のカテゴリー記事は、ワタクシ自身がこれまでに勉強したいろいろな項目について、テキストにあんまり書いてない内容などを勝手に妄想したメモです。
ワタクシ自身の備忘録のために書いており「初学者にわかりやすく説明する」というものではございません。
導入なしに唐突に話が始まり、おそらく意味不明な文章かもしれません。
しかし、せっかく考えたことなので、記事の内容がもし誰か1人でもお役に立てれば幸いです。


式の意味を考えよう!

ループ計算の式を受け入れる前に、その式の特徴をじっくり見てみましょう。ループの式は、各成分に分数の「補正」がかかるようになっています。仮に

NMFの行列分解式(収束の条件)

つまり「もとのデータに一致するパーフェクトな分解が見つかった」という状態なら分母と分子が等しくなり、計算によって結果が変わりません。つまり「求める正解」に一致すると計算が収束するようになっています。
さらに、例えば「行列T, 行列Vの成分が”あるべき値”に比べて大きすぎる」場合、その積である

xij

が元のデータ行列に比べ大きくなって、その結果ループの式の分母が分子よりも大きくなります。つまりT, Vの各成分に「小さくなるような補正」がかかることになります。
一方でT, Vが「小さすぎる」場合は逆に「大きくなるような補正」がかかり、これよりループの式は確かに「”あるべき値”に近づいていく」計算になっていることがわかります。

そして、これ実はすごく重要なことですが、ループの式には足し算と掛け算(割り算は逆数の積、ですね)しか現れていません。つまり引き算が存在しません。ということは、行列の各初期値が非負値なら絶対に負にはなりません。「非負値行列因子分解」ですからね。

ちなみにループ計算に現れた

NMFの行列分解式(相関関数)

の「物理的意味」は何でしょうか?
それぞれ「データと重み付け係数の相関」「データと純物質スペクトルの相関」と考えられます。「類似度」ともいえますかね。両者が「よく似ていれば」大きな値となり、「似ていなければ」小さな値になります。まあ余談でした。

べじぱみゅもハマった落とし穴!

さて、実際にこのプログラムを書こうとする際に注意すべきポイントがあります。それは

NMFの行列分解式(ループ計算式)

の2つの計算は並行して行ってはならず、どちらか片方を計算したらその時点で

xij

の各値を更新し、もう片方の計算は更新したものを用いて行わなければならない、という点です。
これはなかなかの落とし穴で、ワタクシも最初にこの点を見逃してプログラムを書いてしまい、うまく計算できませんでした。この理由を図で説明しようと思います。


NMFの行列分解式(間違いループ)

ここでは例として、n回ループ計算した後に行列Tが少し大きすぎて、行列Vがほぼ「正解」になった、と仮定します。この図に示すように、両者を並行して計算してしまうとVはいじる必要がないのに小さく補正されてしまい、「正解」から遠のきます。つまりこの方法だと必要以上に補正がかかりすぎることになります。(上の図でTn+1は「少し小さい」となってますが、たまたまほぼ正解、となるかもしれません)
仮にTもVも「ぴったり」正解になればループは収束しますが、ちょっとでも正解からズレているとフラフラしてなかなか収束しません。

NMFの行列分解式(正しいループ)


そこで、各ループ内で行列T, Vを補正する際、どちらか片方を計算するたびに

xij

の各値を更新します。すると補正が「鈍く」なります。こうすれば行列TおよびVはフラフラすることなく「正解」に向かってゆっくり近づいていく、と言う状況になります。実際にワタクシが失敗した例をふまえ、収束の様子を模式的に書くと

NMFの行列分解式(ループの比較)


こんなイメージです。並行計算でも初期値よりある程度は近づきますが、基本的にゴール周辺をフラフラしていつまでも収束しません。片方ずつ

xij

を更新する方法なら、スピードはゆっくりになりますが確実にゴールに近づいていきます。




はっぴぃ理系らいふ、いぇい
ヽ(・ε・)人(・ε・)ノ キミモナカマニナロウゼ
   

【文責 べじぱみゅ】