隐马尔可夫链

import numpy as np
import math

class Viterbi:
    def __init__(self, o, A, B, pi, index, N, M):
        self.N = self.B.shape[1] #shape[1]列数
        self.M = self.B.shape[0] #shape[0]行数
        self.o = o #可观测状态
        self.A = A #状态转移概率矩阵
        self.B = B #观测概率矩阵
        self.pi = pi #初始状态概率
        self.index = index #观测状态 下标数
        self.T = len(self.o) #观测序列一共有多少值
        self.delta = [[0]*self.N]*self.T #delta为局部概率
        self.keci = [[0]*self.N]*self.T
        self.i = []#得到的状态序列是
        
        
    #前向计算求最大概率 
    def calculate(self):  
        for i in range(self.N):
            self.delta[0][i] = pi[i]*B[i][0]
        for t in range(1,self.T):
            ot = self.o[t]
            ot_index = self.index[ot]
            for i in range(self.N):
                max = 0
                maxj = 0
                for j in range(self.N):
                    p = self.delta[t-1][j]*self.A[j][i]*self.B[i][ot_index]
                    if p > max:
                        max = p
                        maxj = j
                self.delta[t][i] = max
                self.keci[t][i] = maxj

    def best_path(self):
        max = 0
        maxi =0
        path = []
        for i in range(self.N):
            p =self.delta[self.T-1][i]
            if p > max:
                max = p
                maxi =i
            path.append(maxi+1)
        for t in range(self.T-1, 0, -1):
            maxi = self.keci[t][maxi]
            path.append(maxi+1)
        for i in range(len(path)-1, -1, -1):
            self.I.append(path[i])
        print(self.I)

if __name__=='__main__':
    A = np.array([[0.7, 0.3],
                  [0.4, 0.6]])
    B = np.array([[0.1, 0.4, 0.5],
                  [0.6, 0.3, 0.1]])
    pi = np.array([0.6, 0.4])
    o = ['walk', 'shop', 'clean']
    index = {'walk':0, 'shop':1, 'clean':2}  
    I = ['Rainy', 'Sunny']
    
Sunny Rainy Rainy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值