White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

plsa 続き

http://wg-stein.blogspot.com/2009/11/probabilistic-latent-semantic-analysis.html
ここを参考に訓練データを↑のurlと一緒、z=3でやったらなんかわかった気がする。

p(z) [0.24, 0.46, 0.31]
p(d|z) [
[0.36, 0.43, 0.21, 4.0e-32, 8.3e-33, 1.3e-28, 1.7e-30, 1.7e-198, 2.0e-200, 1.0e-200, 5.0e-200],
[0.0, 0.0, 0.0, 3.4e-291, 1.7e-288, 2.3e-288, 3.0e-290, 0.30, 0.26, 0.22, 0.22],
[6.3e-129, 4.0e-132, 5.9e-130, 0.22, 0.22, 0.28, 0.28, 2.4e-262, 1.2e-262, 1.1e-261, 3.4e-261]]
p(w|z) [
[0.29, 0.29, 0.43, 1.4e-31, 1.3e-28, 8.8e-32, 3.6e-201, 1.6e-198, 1.5e-199],
[0.0, 0.0, 0.0, 1.9e-288, 2.1e-288, 1.9e-291, 0.30, 0.26, 0.44],
[1.0e-131, 6.8e-129, 1.0e-130, 0.28, 0.39, 0.33, 3.1e-262, 1.4e-263, 4.5e-261]]

という感じに三つに分かれてる。・・ってあれということはp(z|d_t)が求めるべき数値なのか?

上を見た限りでも、
p(z|d_t)=p(d_t|z)p(z)
=Σ(w∈d_t)n(w)p(w|z)p(z)
っぽい感じがするのだけど。

試しに[1,1,1,0,0,0,0,0,0]を入れて、

    def test(self, dt):
        return [sum([ dt[i] * self.pzw[z][i] * self.pz[z] for i in range(self.nw)]) for z in range(self.nz)]

とやってみたら

[0.23728813559322032, 0.0, 2.1055555391769686e-129]

と答えが来て、あーこれはクラス1ですねと判別されたんだけど。

適応例が間違ってる気がしないでもない。