import math state_set = ('H', 'L')
observation_set = ('A', 'G', 'C', 'T',)
start_probability = {'H': 0.6, 'L': 0.4, }
transition_probability = { 'H': {'H': 0.4, 'L': 0.4, }, 'L': {'H': 0.2, 'L': 0.5, }, }
emission_probability = { 'H': {'A': 0.2, 'G': 0.3, 'C': 0.3, 'T': 0.2}, 'L': {'A': 0.3, 'G': 0.2, 'C': 0.2, 'T': 0.3}, }
observation_seq = ['G', 'C', 'A', 'C', 'T', 'G']
def viterbi(observation_seq, state_set, start_prob, trans_prob, emit_prob): V = [{}] path = {}
for state in state_set: start_log_prob = math.log2(start_prob[state]) emit_log_prob = math.log2(emit_prob[state][observation_seq[0]]) V[0][state] = start_log_prob + emit_log_prob path[state] = [state]
for t in range(1, len(observation_seq)): V.append({}) new_path = {}
for current_state in state_set: max_transition_prob = float('-inf') prev_state_selected = None
for prev_state in state_set: transition_log_prob = math.log2( trans_prob[prev_state][current_state]) prev_state_prob = V[t - 1][prev_state] current_prob = prev_state_prob + transition_log_prob
if current_prob > max_transition_prob: max_transition_prob = current_prob prev_state_selected = prev_state
emit_log_prob = math.log2( emit_prob[current_state][observation_seq[t]]) V[t][current_state] = max_transition_prob + emit_log_prob new_path[current_state] = path[prev_state_selected] + \ [current_state]
print(f"时刻 {t}, 状态 {current_state}: {V[t][current_state]}")
path = new_path
max_prob = float('-inf') final_state_selected = None
for final_state in state_set: final_prob = V[len(observation_seq) - 1][final_state]
if final_prob > max_prob: max_prob = final_prob final_state_selected = final_state
return max_prob, path[final_state_selected]
probability, path = viterbi(observation_seq, state_set, start_probability, transition_probability, emission_probability)
print("\n最大概率:", probability) print("最可能的隐藏状态序列:", path)
|