机器学习(十五)隐马尔科夫模型-未完待续

一、HMM相关概念

二、前向传导

#coding=utf-8
import numpy as np
#前向传导算法

def Forward(A,B,Pi,O):
    n=O.shape[0]
    m=A.shape[0]
    dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j出现的概率
    dis2src[0,:]=Pi*(B[:,O[0]])#初始化第一层各个顶点与观测t=0的联合概率
    for t in range(n-1):
        t=t+1
        for i in range(m):
            predis=dis2src[t-1,:]
            #第t时刻的所有顶点,到t+1时刻顶点i的距离总和,然后再计算i顶点到观测变量O[t]的距离
            dis2src[t,i]=np.sum(predis*A[:,i])*B[i,O[t]]
    print sum(dis2src[t])

A=np.asarray([0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5]).reshape(3,3)
B=np.asarray([0.5,0.5,0.4,0.6,0.7,0.3]).reshape(3,2)
Pi=np.asarray([0.2,0.4,0.4])
O=np.asarray([0,1,0])
Forward(A,B,Pi,O)


三、维比特算法实践

#coding=utf-8
import numpy as np
#A为状态转移矩阵,B为观测矩阵,Pi为初始状态概率,o为观测序列
#函数的目标就是返回0所对应的,状态序列
def Viterbi(A,B,Pi,O):
    n=O.shape[0]
    m=A.shape[0]

    dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j,到原点的最大距离
    path=np.zeros((n,m),dtype=np.int)
    t=0;
    dis2src[t,:]=Pi*(B[:,O[t]])#初始化第一层顶点到原点的距离

    for t in range(n-1):
        t=t+1
        for i in range(m):
            predis=dis2src[t-1,:]

            #第t时刻的所有顶点,到t+1时刻顶点i的距离
            node_i2src=predis*A[:,i]
            dis2src[t,i]=np.max(node_i2src)*B[i,O[t]]


            path[t,i]=np.argmax(node_i2src);#计算顶点i对应到上一时刻的顶点的最大路径


    bestpaht=-1*np.ones(n,dtype=np.int)
    bestpaht[n-1]=(np.argmax(dis2src[n-1,:]))
    print np.log(np.max(dis2src[n-1,:]))
    #回溯
    for t in range(n-1)[::-1]:
        ti=path[t+1,bestpaht[t+1]]
        bestpaht[t]=ti
    print (bestpaht+1)

A=np.asarray([0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333]).reshape(3,3)
B=np.asarray([0.5,0.5,0.75,0.25,0.25,0.75]).reshape(3,2)
Pi=np.asarray([0.333,0.333,0.333])
O=np.asarray([0,0,0,0,1,0,1,1,1,1])
Viterbi(A,B,Pi,O)


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值