非負値行列因子分解(NMF)

オライリー集合知プログラミング」で特徴抽出の解説があり面白そうなので試してみた。
Pythonはご遠慮したいので.NETかJavaかなのだけど、最近はやりの言語なのに行列演算を扱えるライブラリは標準装備されてないのねぇ。。
Java+JAMAを使ってみた。

名前 国語 数学 理科 社会
A 50 50 50 50
B 100 20 30 90
C 100 30 40 100
D 90 10 10 80
E 10 100 90 20

上記のA〜E君5人のそれぞれ4教科のテストの点数の表を行列に変換してNMFを行う。
特徴数は2、繰り返し数は5000回で実行。

特徴の行列の計算結果は、

特徴 国語 数学 理科 社会
特徴1 7.7 78.2 71.5 15.9
特徴2 98.7 1.5 10.4 89.7


次に重み行列の計算結果は、

名前 特徴1 特徴2
A 0.6 0.5
B 0.3 1.0
C 0.4 1.0
D 0.1 0.9
E 1.3 0.0


特徴の行列から、特徴1が理系型、特徴2が文系型と読める。
重みの行列から、
A君は特徴1と特徴2を同じくらいもっているので平均型。
B君は特徴2に偏っているので文系型。
C君、D君も同じく文系型。
E君は特徴1に偏っているので理系型。


と、いう分析でいいんじゃろか。。
もっと面白い例ないかなぁ。


集合知プログラミング

集合知プログラミング