Exemple #1
0
 def predict(self, alpha):
     m = Message()
     # add change component
     m.add_potential(Potential(self.prior.alpha, self.prior.a, self.prior.b, self.log_p1 + alpha.log_likelihood()))
     # add no-change components
     for p in alpha.potentials:
         m.add_potential(Potential(p.alpha, p.a, p.b, p.log_c + self.log_p0))
     return m
Exemple #2
0
 def forward(self, obs):
     alpha = []
     alpha_predict = []
     for i in range(obs.shape[0]):
         if i == 0:
             m = Message()
             m.add_potential(Potential(self.prior.alpha, self.prior.a, self.prior.b, self.log_p1))
             m.add_potential(Potential(self.prior.alpha, self.prior.a, self.prior.b, self.log_p0))
             alpha_predict.append(m)
         else:
             alpha_predict.append(self.predict(alpha[-1]))
         alpha.append(self.update(alpha_predict[-1], obs[i, :]))
     return [alpha_predict, alpha]
Exemple #3
0
 def backward(self, obs, start=0, length=0):
     if length == 0:
         length = obs.shape[0]
         start = length-1
     beta = []
     for i in range(start, start - length, -1):
         message = Message()
         # change
         p_obs = Potential.from_observation(obs[i, :], self.m, self.n)
         pot_change = p_obs.copy()
         if len(beta) > 0:
             temp = Message()
             for p in beta[-1].potentials:
                 temp.add_potential(p * self.prior)
             pot_change.log_c += self.log_p1 + temp.log_likelihood()
         message.add_potential(pot_change)
         # no change
         if len(beta) > 0:
             for p in beta[-1].potentials:
                 p2 = p * p_obs
                 p2.log_c += self.log_p0
                 message.add_potential(p2)
         beta.append(message)
     beta.reverse()
     return beta
Exemple #4
0
 def update(self, predict, obs):
     m = Message()
     p_obs = Potential.from_observation(obs, self.m, self.n)
     for p in predict.potentials:
         m.add_potential(p * p_obs)
     return m