Example #1
0
 def get_edge_posteriors(self, seq):
     nr_states = self.nr_states
     node_potentials, edge_potentials = self.build_potentials(seq)
     forward, backward = forward_backward(node_potentials, edge_potentials)
     H, N = forward.shape
     likelihood = np.sum(forward[:, N-1])
     return self.get_edge_posteriors_aux(seq, forward, backward, node_potentials, edge_potentials, likelihood)
 def get_edge_posteriors(self,seq):
     nr_states = self.nr_states
     node_potentials,edge_potentials = self.build_potentials(seq)
     forward,backward = forward_backward(node_potentials,edge_potentials)
     H,N = forward.shape
     likelihood = np.sum(forward[:,N-1])
     return self.get_edge_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
 def get_posteriors(self, seq):
     forward, backward = forward_backward(seq)
     # self.sanity_check_fb(forward,backward)
     H, N = forward.shape
     likelihood = np.sum(forward[:, N-1])
     node_posteriors = self.get_node_posteriors_aux(seq, forward, backward, likelihood)
     edge_posteriors = self.get_edge_posteriors_aux(seq, forward, backward, likelihood)
     return [node_posteriors, edge_posteriors], likelihood
Example #4
0
 def get_posteriors(self,seq):
     forward,backward = forward_backward(seq)
     #self.sanity_check_fb(forward,backward)
     H,N = forward.shape
     likelihood = np.sum(forward[:,N-1])
     node_posteriors = self.get_node_posteriors_aux(seq,forward,backward,likelihood)
     edge_posteriors = self.get_edge_posteriors_aux(seq,forward,backward,likelihood)
     return [node_posteriors,edge_posteriors],likelihood 
Example #5
0
 def get_posteriors(self,seq):
     nr_states = self.nr_states
     node_potentials,edge_potentials = self.build_potentials(seq)
     forward,backward = forward_backward(node_potentials,edge_potentials)
     #self.sanity_check_fb(forward,backward)
     H,N = forward.shape
     likelihood = np.sum(forward[:,N-1])
     node_posteriors = self.get_node_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
     edge_posteriors = self.get_edge_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
     return [node_posteriors,edge_posteriors],likelihood 
Example #6
0
 def get_posteriors(self, seq):
     nr_states = self.nr_states
     node_potentials, edge_potentials = self.build_potentials(seq)
     forward, backward = forward_backward(node_potentials, edge_potentials)
     # self.sanity_check_fb(forward,backward)
     H, N = forward.shape
     likelihood = np.sum(forward[:, N-1])
     node_posteriors = self.get_node_posteriors_aux(seq, forward, backward, node_potentials, edge_potentials, likelihood)
     edge_posteriors = self.get_edge_posteriors_aux(seq, forward, backward, node_potentials, edge_potentials, likelihood)
     return [node_posteriors, edge_posteriors], likelihood
    def get_objective_seq(self,parameters,seq,exp_counts):
         #print seq.nr
#         nr_states = self.nr_states
         node_potentials,edge_potentials = self.build_potentials(seq)
         forward,backward = forward_backward(node_potentials,edge_potentials)
         H,N = forward.shape
         likelihood = np.sum(forward[:,N-1])
#         import pdb;pdb.set_trace()
         #node_posteriors = self.get_node_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
         #edge_posteriors = self.get_edge_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
#         seq_objective = 0
         seq_objective2 = 1
         for pos in xrange(N): 
             true_y = seq.y[pos]
             for state in xrange(H):
#                 node_f_list = self.feature_class.get_node_features(seq,pos,state)
#                 backward_aux = backward[state,pos]
#                 forward_aux = forward[state,pos]
#                 forward_aux_div_likelihood = forward_aux/likelihood

                 ##Iterate over feature indexes
#                 prob_aux = forward_aux_div_likelihood*backward_aux
#                 for fi in node_f_list:
#                     ## For the objective add both the node features and edge feature dot the parameters for the true observation
#                     if(state == true_y):
#                         seq_objective += parameters[fi]
#                         ## For the gradient add the node_posterior ##Compute node posteriors on the fly
#                    
#                     exp_counts[fi] += prob_aux
                 if(state == true_y):
                     seq_objective2 *= node_potentials[state,pos]
                      
                 #Handle transitions
                     if(pos < N-1):
                         true_next_y = seq.y[pos+1]
                         for next_state in xrange(H):
    #                         backward_aux2 = backward[next_state,pos+1]
    #                         node_pot_aux = node_potentials[next_state,pos+1]
    #                         edge_f_list = self.feature_class.get_edge_features(seq,pos+1,next_state,state)
                             ## For the gradient add the edge_posterior
    #                         edge_aux = edge_potentials[state,next_state,pos]
    #                         prob_aux = forward_aux_div_likelihood*edge_aux*node_pot_aux*backward_aux2
    #                         for fi in edge_f_list: 
    #                             ## For the objective add both the node features and edge feature dot the parameters for the true observation
    #                             if(next_state == true_next_y):
    #                                 seq_objective += parameters[fi]
    #                             exp_counts[fi] += prob_aux
                             if(next_state == true_next_y):
                                 seq_objective2 *= edge_potentials[state,next_state,pos]
         
         if seq_objective2 > likelihood:
             import pdb; pdb.set_trace()
         seq_objective2 = np.log(seq_objective2)
#         print seq_objective, seq_objective2         
         return seq_objective2,np.log(likelihood)
    def get_objective_seq(self,parameters,seq,exp_counts):
         #print seq.nr
         nr_states = self.nr_states
         node_potentials,edge_potentials = self.build_potentials(seq)
         forward,backward = forward_backward(node_potentials,edge_potentials)
         H,N = forward.shape
         likelihood = np.sum(forward[:,N-1])
         #node_posteriors = self.get_node_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
         #edge_posteriors = self.get_edge_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
         seq_objective = 0
         for pos in xrange(N): 
             true_y = seq.y[pos]
             for state in xrange(H):
                 node_f_list = self.feature_class.get_node_features(seq,pos,state)
                 backward_aux = backward[state,pos]
                 forward_aux = forward[state,pos]
                 forward_aux_div_likelihood = forward_aux/likelihood

                 ##Iterate over feature indexes
                 prob_aux = forward_aux_div_likelihood*backward_aux
                 for fi in node_f_list:
                     ## For the objective add both the node features and edge feature dot the parameters for the true observation
                     if(state == true_y):
                         seq_objective += parameters[fi]
                     ## For the gradient add the node_posterior ##Compute node posteriors on the fly
                     exp_counts[fi] += prob_aux
                 #Handle transitions
                 if(pos < N-1):
                     true_next_y = seq.y[pos+1]
                     for next_state in xrange(H):
                         backward_aux2 = backward[next_state,pos+1]
                         node_pot_aux = node_potentials[next_state,pos+1]
                         edge_f_list = self.feature_class.get_edge_features(seq,pos+1,next_state,state)
                         ## For the gradient add the edge_posterior
                         edge_aux = edge_potentials[state,next_state,pos]
                         prob_aux = forward_aux_div_likelihood*edge_aux*node_pot_aux*backward_aux2
                         for fi in edge_f_list: 
                             ## For the objective add both the node features and edge feature dot the parameters for the true observation
                             if(next_state == true_next_y):
                                 seq_objective += parameters[fi]
                             exp_counts[fi] += prob_aux
         return seq_objective,likelihood
 def forward_backward(self,seq):
     node_potentials,edge_potentials = self.build_potentials(seq)
     forward,backward = forward_backward(node_potentials,edge_potentials)
     #print sanity_check_forward_backward(forward,backward)
     return forward,backward
Example #10
0
    def get_objective_seq(self,parameters,seq,exp_counts):
         #print seq.nr
#         nr_states = self.nr_states
         node_potentials,edge_potentials = self.build_potentials(seq)

#         import pdb
#         pdb.set_trace()

         forward,backward = forward_backward(node_potentials,edge_potentials)
         if np.any(np.isnan(forward)):
            import pdb
            pdb.set_trace()
         H,N = forward.shape
         likelihood = np.sum(forward[:,N-1])
         if np.any(np.isnan(likelihood)):
            import pdb
            pdb.set_trace()
         node_posteriors = self.get_node_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)
         edge_posteriors = self.get_edge_posteriors_aux(seq,forward,backward,node_potentials,edge_potentials,likelihood)

         

         seq_objective = 1.0
         # Compute sequence objective looking at the gold sequence.
         for pos in xrange(N): 
             true_y = seq.y[pos]
             node_f_list = self.feature_class.get_node_features(seq,pos,true_y)
             seq_objective *= node_potentials[true_y,pos]
             if(pos < N-1):
                 true_next_y = seq.y[pos+1]
                 seq_objective *= edge_potentials[true_y,true_next_y,pos]

         # Now compute expected counts.
         # Take care of nodes.
         for pos in xrange(N): 
             for state in xrange(H):
                 node_f_list = self.feature_class.get_node_features(seq,pos,state)
                 for fi in node_f_list:
                     exp_counts[fi] += node_posteriors[state,pos]
         # Take care of edges.
         # 1) Initial position.
         for state in xrange(H):
           edge_f_list = self.feature_class.get_edge_features(seq,0,state,-1)
           for fi in edge_f_list: 
               exp_counts[fi] += node_posteriors[state,0]
         # 2) Intermediate position.
         for pos in xrange(N-1):
             for state in xrange(H):
                 for next_state in xrange(H):
                   edge_f_list = self.feature_class.get_edge_features(seq,pos+1,next_state,state)
                   for fi in edge_f_list: 
                       exp_counts[fi] += edge_posteriors[state,next_state,pos]
         # 3) Final position.
         for state in xrange(H):
           edge_f_list = self.feature_class.get_edge_features(seq,N,-1,state)
           for fi in edge_f_list: 
               exp_counts[fi] += node_posteriors[state,N-1]
               
         if seq_objective > likelihood:
             import pdb; pdb.set_trace()
         seq_objective = np.log(seq_objective)

         if np.any(np.isnan(seq_objective)):
            import pdb
            pdb.set_trace()

         if np.any(np.isnan(np.log(likelihood))):
            import pdb
            pdb.set_trace()

         return seq_objective,np.log(likelihood)
Example #11
0
def compute_ess_dhmm(observation_vector,prior,transition_matrix,emission_matrix, dirichlet):
    #print "__________________________________"
    #print "Observation:",observation_vector,"\n","Hidden:",hidden,"\n","Prior",prior,"\n","Transition",transition_matrix,"\n","Emission",emission_matrix
    (S,O)=np.shape(emission_matrix)
    exp_num_trans=np.zeros((S,S))
    exp_num_visits1=np.zeros((1,S)).flatten(1)
    exp_num_visitsT=np.zeros((1,S)).flatten(1)
    exp_num_emit = dirichlet*np.ones((S,O))
    loglik = 0
    num_sequences=len(observation_vector)
    for i in range(num_sequences):
        observation_i=observation_vector[i]
        #Number of observations
        T=len(observation_i)
        obslik = evaluate_pdf_cond_multinomial(observation_i, emission_matrix)
        #E
        [alpha, beta, gamma, xi,xi_summed,current_ll] = forward_backward(prior, transition_matrix, emission_matrix,observation_i,True,obslik)
        loglik = loglik + current_ll
 
        exp_num_trans = exp_num_trans + xi_summed
    
        #print "EXPETCED VISISTS 1 BEFORE",exp_num_visits1
        exp_num_visits1 += gamma[:,0]
        #print "EXPETCED VISISTS 1 AFTER",exp_num_visits1
        exp_num_visitsT = exp_num_visitsT + gamma[:,T-1]
        #print "Visits 1",exp_num_visits1
        #print "Visits T",exp_num_visitsT
        #print "EXP NUM TRANS",exp_num_trans
        for t in range(0,T):
            o = observation_i[t]
            exp_num_emit[:,o] = exp_num_emit[:,o] + gamma[:,t]
        #print "Log Likelihood:",loglik
        #print "Exp Num Transitions",exp_num_trans
        #print "Exp Num Visits 1",exp_num_visits1
        #print "Exp Num Visits T",exp_num_visitsT
        #print "Exp Num Emit",exp_num_emit
        #print "Xi Summed",xi_summed
        #print "Sequence",np.array(observation_i)+1
        #print "Alpha",alpha
        #print "Beta",beta
        #raw_input('After iteration%s'%i)
        
        new_pi=normalize(gamma[:,0])[0]
        new_A=xi_summed/np.sum(gamma,1)
        (number_of_hidden_states,number_of_observation_states)=np.shape(emission_matrix)
        B_new = np.zeros(np.shape(emission_matrix))
        for j in xrange(number_of_hidden_states):
            for k in xrange(number_of_observation_states):
                numer = 0.0
                denom = 0.0
                for t in xrange(T):
                    if observation_i[t] == k:
                        numer += gamma[j][t]
                    denom += gamma[j][t]
                    B_new[j][k] = numer/denom
            
        
        
        #print "******************************"
        #print "New Pi:",new_pi
        #print "New A:",new_A
        #print "After normalizing",mk_stochastic(new_A)
    return [loglik,exp_num_visits1,exp_num_visitsT,exp_num_trans,exp_num_emit]
Example #12
0
 def forward_backward(self, seq):
     node_potentials, edge_potentials = self.build_potentials(seq)
     forward, backward = forward_backward(node_potentials, edge_potentials)
     sanity_check_forward_backward(forward, backward)
     return forward, backward