PRMLHackason#2でpLSAを見まねで書いてみたが使い方がわからなかった
今日はPRMLHackason(http://atnd.org/events/2007)で、pLSAのプログラムを下のblogを見て自分で数式を紙に書いて照らし合わせながら打ち込んでました。
http://satomacoto.blogspot.com/2009/10/pythonplsa.html
一応プログラムは動いたのですが、「で、これをどう見れば便利か」がよくわかりませんでした。
自分が考えてたのは
P(d,w) = Σ_z P(z)P(w|z)P(d|z)
でP(z),P(w|z),P(d|z)がわかった後に、w_tを観測した時のドキュメントdの存在確率p(d|w_t)を知ることはできないかという事でした。
実際にソース元と同じデータ
n = [[1,1,0,0], [0,0,1,1], [0,0,0,1]]
で学習した後に
w_t = [1,1,0,0]
を与えて、plsa()内で
def test(self, wt): for wti in wt: return [sum([p.pz[z]*p.pzw[z][wti]*p.pzd[z][d] for z in range(self.nz)])for d in range(self.nd)]
と関数つくってやれば結果が出るかとかやったのですが、
[0.20000000000000001, 8.5943766684486206e-32, 4.757214280148525e-39]
とか出てきました。これで「n[0]と与えたw_tが確率高いしn[0]に属する」とかいう結論になるんでしょうか。
なんか、今回の例でいうと
d[0] = [[1,1,0,0], [1,0,1,0], [0,1,1,0]]
が一つのドキュメント群で、他にも
d[1] = [[1,1,0,1], [1,0,1,1], [0,1,1,1]]
みたいなドキュメント群があって、各d[i]毎に確率出して一番高い確率出すiクラスに分類する、とかいうの出来ないかなぁと思ったのですが。・・もしかして各d[i]での最高値とればいいのかな?
・・とまあこんな感じで数式をpythonで書いてみたのはいいけどどう使えばいいか分からない状態です。個別の問題見てみた方がいいんでしょうねぇ。