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


あとは実践あるのみ!

さて、計算法については前回まででお話ししたので、あとは実践してみましょう。カーブフィッティングで簡単に分離できなそうな、複雑なスペクトルの例をもう一度。

複雑なスペクトル(列)の例


この「強度」の数値データを行列として入力します。ちなみに横軸は161点(I=161)、奥行きは20個(J=20)の計3220個の数値データです。
計算を始めるにあたって、行列T(純物質のスペクトル)および行列V(重み係数)の初期値を決めなければなりません。
行列Tについては一般的に「最初のスペクトルと最後のスペクトル」を用いることが多いです。ただここではこの手法の威力を確認するために、より「過酷な」条件として、もっといい加減な初期スペクトルを仮定しました。
行列Vの初期値の決め方はいろいろあります。初期を物質1(1の係数1で2の係数ゼロ)、最後を物質2(1の係数ゼロで2の係数1)としてその間は線形に変化する係数を仮に入力したり、とかね。ただここでは、より「過酷な」条件として、もっといい加減な係数を仮定しました。

計算結果を以下に示します。ループ計算は100回行いました。

NMF実践結果(スペクトル)
NMF実践結果(係数)


初期のスペクトル(点線)は、ピーク中心値だけそれっぽくして後はお世辞にも似ているとはいえないものを入力しました。そして初期の係数はなんともいい加減に、全領域で半分ずつ、としました。ここでは100回ループ計算後の結果を示していますが、なかなかいい感じになっていると思います。
ちなみに計算の収束(もとのデータ行列と x ̂ ij の各成分の差の2乗和)の様子を以下に示します。

NMF実践結果(収束具合)

まだまだ収束しきっていない感満載ですけどね。でも実際にこれ以上増やしても結果のスペクトルおよび係数のグラフはあんまり見た目に変化はないです。
初期値をもっとマジメに入れると、もっと早く収束します。

さて、今回入力したスペクトル、もともとワタクシがExcelで勝手に作ったものです。ここで「答え合わせ」をしてみたいと思います。

NMF実践結果(もともとのスペクトル)
NMF実践結果(もともとの係数)


もともと、こういうスペクトルおよび係数の重み付けで構成したデータでした。
スペクトルおよび係数の絶対値、それから奥行き10らへんの遷移領域の係数は微妙なところですが、100回計算後のスペクトルの形状はほぼ正解だし、奥行7~13ぐらいが遷移領域である点もちゃんと当ててるし、全体的にはけっこういい感じだと思います。

とりあえずやってみよう!

今回お話しした「非負値行列因子分解(NMF)」、かなり強力です。「強力」というより「万能」と言ったほうがいいかもしれません。カーブフィッティングはわりと「単純」なスペクトルにしか適用できず、複雑になってくるとパラメータが多すぎてどんどん信頼できなくなっていきます。
NMFは基本的に、「最初と最後のスペクトル」を初期値として入力すれば1つの答えに向かって計算が収束していき、作業者の意図が入る余地がほとんどありません(この辺の話は次回ラストでもうちょっとお話しします)。そして原理的に、単純なスペクトルでも複雑なスペクトルでも、あらゆるものに適用可能です。
多変量解析の手法としてはマイナーな分野ですが、是非使ってみてください!




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

【文責 べじぱみゅ】