mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
||||||||||||||||||||||||||||||||||||||||||||||||
EMから順番に説明して, 繋がるようになっています。
「計算統計I」を読んでわかった人にはわりと不要かもしれませんが,
EMの説明がいきなりQ関数を出すやや天下り的な方法ではなく,
いわゆる Neal-Hinton 流に下限を maximize する説明から, 自然にQ関数が導かれる
ようになっています。(実際には, Ghahramaniの説明を参考にした。)
他には, 途中の計算を省略せずに書いてあるということと,
言語処理向けに, 正規分布や Wishart 分布が全然出てこないのが特徴かも
しれません。
応用例として, LDAとVB-HMMの説明が簡単に含まれています。
1つ注: モデル選択の議論は含まれていません。 (∫∫∫p(D,z,θ,m)dzdθdm → p(m|D) ∝ p(m)exp(F(m)) という話)。 変分ベイズ法の一番本質的な所はここではないと思うのと (単にそこまで書く時間がなかったともいう ;), m を隠れ変数の数だとした時には, 現代的にはもっといい方法があると思うので, 興味のある方は元論文をご覧下さい。
夏っぽい画像 (謎)。
12345 101:1 103:2 107:3 109:4 113:5 127:6は一般的に, (12345,101) -> 1, (12345,103) -> 2, .., (12345,127) -> 6, .. のような疎行列として表せる。
1 m = sparse(n,l); 2 while ~feof(fid) 3 l = fgetl(fid); 4 d = sscanf(l,'%d',1); 5 i = strpbrk(l,' '); % space or tab 6 f = sscanf(l(i+1:end),'%d:%g',Inf); 7 n = length(f) / 2; 8 for j = 1:n 9 m(d,f(2*j-1)) = f(2*j); 10 end 11 end
これは小さなデータについては何の問題もなく動くのだが,
ファイルが大きくなるとかなり遅くなる。
そんなもんか, と思ってあきらめていたのだが, プロファイルを取ってみたところ
(profile on), 上の9行目でほとんどの時間が食われていることがわかった。
ハッと気が付いたのだが, MATLABの疎行列を表示してみると,
内部的にはrow-wiseではなく column-wise に格納されているように見える。
ということは,
m(f(2*j-1),d) = f(2*j);とすると速くなるのでは.. と思って実験してみると, とてつもなく速くなった。;
>> tic, m = fmatrix('bncm.uni.dat');, toc loading lines 4120/4120.. elapsed_time = 926.6075 (seconds) >> tic, m2 = fmatrix2('bncm.uni.dat');, toc loading lines 4120/4120.. elapsed_time = 14.2434 (seconds)何と65倍。 (必要なら, 最後で m = m' とすればよい。)
タイトル一覧 |