Python Implementation of Viterbi Algorithm

前端 未结 6 1569
别跟我提以往
别跟我提以往 2020-12-12 20:43

I\'m doing a Python project in which I\'d like to use the Viterbi Algorithm. Does anyone know of a complete Python implementation of the Viterbi algorithm? The correctness

6条回答
  •  失恋的感觉
    2020-12-12 21:22

    I have modified @Rhubarb's answer for the condition where the marginal probabilities are already known (e.g by computing the Forward Backward algorithm).

    def viterbi (transition_probabilities, conditional_probabilities):
        # Initialise everything
        num_samples = conditional_probabilities.shape[1]
        num_states = transition_probabilities.shape[0] # number of states
    
        c = np.zeros(num_samples) #scale factors (necessary to prevent underflow)
        viterbi = np.zeros((num_states,num_samples)) # initialise viterbi table
        best_path_table = np.zeros((num_states,num_samples)) # initialise the best path table
        best_path = np.zeros(num_samples).astype(np.int32) # this will be your output
    
        # B- appoint initial values for viterbi and best path (bp) tables - Eq (32a-32b)
        viterbi[:,0] = conditional_probabilities[:,0]
        c[0] = 1.0/np.sum(viterbi[:,0])
        viterbi[:,0] = c[0] * viterbi[:,0] # apply the scaling factor
    
        # C- Do the iterations for viterbi and psi for time>0 until T
        for t in range(1, num_samples): # loop through time
            for s in range (0,num_states): # loop through the states @(t-1)
                trans_p = viterbi[:, t-1] * transition_probabilities[:,s] # transition probs of each state transitioning
                best_path_table[s,t], viterbi[s,t] = max(enumerate(trans_p), key=operator.itemgetter(1))
                viterbi[s,t] = viterbi[s,t] * conditional_probabilities[s][t]
    
            c[t] = 1.0/np.sum(viterbi[:,t]) # scaling factor
            viterbi[:,t] = c[t] * viterbi[:,t]
    
        ## D - Back-tracking
        best_path[num_samples-1] =  viterbi[:,num_samples-1].argmax() # last state
        for t in range(num_samples-1,0,-1): # states of (last-1)th to 0th time step
            best_path[t-1] = best_path_table[best_path[t],t]
        return best_path
    

提交回复
热议问题