python实现viterbi算法

states = ('Healthy', 'Fever')

observations = ('normal', 'cold', 'dizzy')

start_probability = {'Healthy': 0.6, 'Fever': 0.4}

transition_probability = {
    'Healthy': {'Healthy': 0.7, 'Fever': 0.3},
    'Fever': {'Healthy': 0.4, 'Fever': 0.6}
}

emission_probability = {
    'Healthy': {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
    'Fever': {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6}
}

def my_viterbi(obs, states, start_p, trans_p, emit_p):
    V=[{}]
    path={}
    # 先计算初始
    for y in states:
        V[0][y]=start_p[y]*emit_p[y][obs[0]]
        path[y]=[y]
    # 计算后面时刻
    for t in range(1, len(obs)):
        V.append({})
        newpath={}
        for y0 in states:
            print(V[t - 1][y0] * trans_p[y0][y] * emit_p[y0][obs[t]], y0)
        for y in states:
            (prob, state) =   max((V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states)
            # print(prob,state)
            V[t][y]=prob
            newpath[y]=path[state]+[y]
        path=newpath
    print(path)
    (prob, state) = max((V[t][y], y) for y in states)
    print(prob,state)
    print(path[state])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值