隐马尔可夫模型(向前算法和维特比算法演示)----python

这篇博客演示了如何运用隐马尔可夫模型(HMM)和维特比算法处理观测序列。通过定义状态转化矩阵、观测概率和观测序列,代码展示了计算观测序列出现概率以及找到最佳状态序列的过程。这在自然语言处理、生物信息学等领域有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

样例:
在这里插入图片描述
观测序列:【A,B,A,B】 (代码中用1,2,1,2代表)

# 隐马尔可夫模型代码演示
def main():
    pos = [[0.4, 0.6, 0], [0, 0.8, 0.2],[0, 0, 1]]  # 状态转化

    A = [0.7,0.3]
    B = [0.4,0.6]
    C = [0.8,0.2]
    gcgl = [A,B,C] # 观测概率
    guance = [1,2,1,2] # 观测序列
    N = len(pos)  # 状态数
    len_g = len(guance) # 观测序列长度
    dp = [[0 for i in range(len_g)]for i in range(N)]
    dp[0][0] = A[0]
    dp[1][0] = 0
    for j in range(1,len_g):
        for i in range(N):
            for k in range(N):      # 上一时刻的状态
                dp[i][j] += dp[k][j - 1] * pos[k][i] * gcgl[i][guance[j] - 1]
    ans = 0
    for i in range(N):
        ans += dp[i][len_g - 1]
        print(dp[i])
    print("观测序列出现概率:" , ans)

    # 维特比算法
    fai = [[0 for i in range(len_g)]for i in range(N)]     # 上一最佳状态存储
    dpv = [[0 for i in range(len_g)]for i in range(N)]
    dpv[0][0] = A[0]
    dpv[1][0] = 0
    fai[0][0] = -1
    for j in range(1,len_g):
        for i in range(N):
            flag = 0
            max1 = 0
            for k in range(N):      # 上一时刻的状态
                if max1 < dpv[k][j - 1] * pos[k][i] * gcgl[i][guance[j] - 1]:
                    max1 = dpv[k][j - 1] * pos[k][i] * gcgl[i][guance[j] - 1]
                    flag = k
            dpv[i][j] = max1
            fai[i][j] = flag    # 上一最佳来源

    maxpos = 0
    maxpoint = 0
    for i in range(N):
        if maxpoint < dpv[i][len_g - 1]:
            maxpos = i
            maxpoint = dpv[i][len_g - 1]

    i = maxpos
    j = len_g - 1
    best = []
    best.append(i)
    while fai[i][j] != -1:
        best.append(fai[i][j])
        i = fai[i][j]
        j -= 1
    best.reverse()
    for i in range(len(best)):
        best[i] += 1
    print("最佳出现状态序列:",best)



if __name__ == '__main__':
    main()

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值