LDAの実装その2
inferenceの意味は演繹、ね。
foreach(self.docs as $m => $doc){
z_n = z_m_n[m];
foreach(doc in $n => $t){
z = z_n[n];
n_m_z[m, z] --; n_z_t[z,t] --; n_z[z] --; # n番目の単語を無所属に。
new_z = ... は後でやるとして
z_n[n] = new_z
n_m_z[m, new_z] ++;
n_z_t[new_z, t] ++;
n_z[new_z] ++; # n番目の単語をnew_z所属に変更
という感じかー。 z_m_n[m][n] はm番目の文章のn番目のキーワードはどこのtopicですか?が入っていると。
で、ここはGibbs samplingの更新式だろうなー
p_z_sum = 0;
for(i=0;i<K;i++){ p_z[i] = n_z_t[i, t] * self.n_m_z[m,i] / self.n_z[i]; p_z_sum += p_z[i]; }
的な感じだろう、多分。
multinomial() はDraw samples from a multinomial distribution.。
で、p_z[i]/p_z_sumの確率で選んで最大になるものを選びます……
Cで組むのめんどくさい(;ω;)
Fast LDAの論文からすると
P[k] ← P[k -1] + ... としておいて u ← uniform[0..1], u<P[k]/P[K]で探索と。