/
inferPLSA.py
68 lines (57 loc) · 1.45 KB
/
inferPLSA.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import numpy as np
import cPickle as pickle
from numpy.random import rand
f = open('nagi', "r")
Md = pickle.load(f)
Mu = pickle.load(f)
Mw = pickle.load(f)
Mud = pickle.load(f)
Mwd = pickle.load(f)
actor_name = pickle.load(f)
f.close()
print Md,Mu,Mw
def ksum(A,dim):
try: return np.sum(A,dim,keepdims=True)
except: return np.expand_dims(np.sum(A,dim),dim)
def plsa_assym(Nwd,Nz,iteration):
#dimension order Nw->Nz->Nd
[Nw,Nd] = np.shape(Nwd)
b = 1.0/Nw/Nd
#Initialization
Pwd = np.expand_dims(Nwd,1)+b
Pz_wd = rand(Nw,Nz,Nd)+b
Pd = rand( 1, 1,Nd)+b
Pz_d = rand( 1,Nz,Nd)+b
Pw_z = rand(Nw,Nz, 1)+b
#Normalization
Pwd /= ksum(ksum(Pwd,0),2)
Pz_wd /= ksum(Pz_wd,1)
Pd /= ksum(Pd,2)
Pz_d /= ksum(Pz_d,1)
Pw_z /= ksum(Pw_z,0)
for i in range(iteration):
#Expectaion
Pz_wd = Pw_z * Pz_d * Pd
Pz_wd /= ksum(Pz_wd,1)
#Maximization
Pwzd = Pwd*Pz_wd
Pzd = ksum(Pwzd,0)
Pwz = ksum(Pwzd,2)
Pd = ksum(Pzd,1)
Pz = ksum(Pzd,2)
Pz_d = Pzd/Pd
Pw_z = Pwz/Pz
return Pd, Pz_d, Pw_z, Pwzd
iteration = 1000
Nz = 2
#Nwd = Mud[0]
Nwd = np.concatenate((Mud[0:4]), axis=1)
#print np.sum(np.sum(Mud[0]))
#print list(Nwd.T)
Pd, Pz_d, Pw_z, Pwzd = plsa_assym(Nwd,Nz,iteration)
print np.shape(Nwd)
from pylab import *
ax = plot(np.sum(Pwzd,1).T)
#ax = plot(np.sum(Pw_z,2).T)
legend(ax,actor_name)
show()