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

本文深入讲解了隐马尔科夫模型(HMM)的核心概念,并通过具体实现介绍了两种关键算法:前向传导算法和维比特算法。前者用于计算观测序列的概率,后者则用于寻找最有可能的状态序列。

一、HMM相关概念

二、前向传导

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #coding=utf-8  
  2. import numpy as np  
  3. #前向传导算法  
  4.   
  5. def Forward(A,B,Pi,O):  
  6.     n=O.shape[0]  
  7.     m=A.shape[0]  
  8.     dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j出现的概率  
  9.     dis2src[0,:]=Pi*(B[:,O[0]])#初始化第一层各个顶点与观测t=0的联合概率  
  10.     for t in range(n-1):  
  11.         t=t+1  
  12.         for i in range(m):  
  13.             predis=dis2src[t-1,:]  
  14.             #第t时刻的所有顶点,到t+1时刻顶点i的距离总和,然后再计算i顶点到观测变量O[t]的距离  
  15.             dis2src[t,i]=np.sum(predis*A[:,i])*B[i,O[t]]  
  16.     print sum(dis2src[t])  
  17.   
  18. A=np.asarray([0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5]).reshape(3,3)  
  19. B=np.asarray([0.5,0.5,0.4,0.6,0.7,0.3]).reshape(3,2)  
  20. Pi=np.asarray([0.2,0.4,0.4])  
  21. O=np.asarray([0,1,0])  
  22. Forward(A,B,Pi,O)  


三、维比特算法实践

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #coding=utf-8  
  2. import numpy as np  
  3. #A为状态转移矩阵,B为观测矩阵,Pi为初始状态概率,o为观测序列  
  4. #函数的目标就是返回0所对应的,状态序列  
  5. def Viterbi(A,B,Pi,O):  
  6.     n=O.shape[0]  
  7.     m=A.shape[0]  
  8.   
  9.     dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j,到原点的最大距离  
  10.     path=np.zeros((n,m),dtype=np.int)  
  11.     t=0;  
  12.     dis2src[t,:]=Pi*(B[:,O[t]])#初始化第一层顶点到原点的距离  
  13.   
  14.     for t in range(n-1):  
  15.         t=t+1  
  16.         for i in range(m):  
  17.             predis=dis2src[t-1,:]  
  18.   
  19.             #第t时刻的所有顶点,到t+1时刻顶点i的距离  
  20.             node_i2src=predis*A[:,i]  
  21.             dis2src[t,i]=np.max(node_i2src)*B[i,O[t]]  
  22.   
  23.   
  24.             path[t,i]=np.argmax(node_i2src);#计算顶点i对应到上一时刻的顶点的最大路径  
  25.   
  26.   
  27.     bestpaht=-1*np.ones(n,dtype=np.int)  
  28.     bestpaht[n-1]=(np.argmax(dis2src[n-1,:]))  
  29.     print np.log(np.max(dis2src[n-1,:]))  
  30.     #回溯  
  31.     for t in range(n-1)[::-1]:  
  32.         ti=path[t+1,bestpaht[t+1]]  
  33.         bestpaht[t]=ti  
  34.     print (bestpaht+1)  
  35.   
  36. A=np.asarray([0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333]).reshape(3,3)  
  37. B=np.asarray([0.5,0.5,0.75,0.25,0.25,0.75]).reshape(3,2)  
  38. Pi=np.asarray([0.333,0.333,0.333])  
  39. O=np.asarray([0,0,0,0,1,0,1,1,1,1])  
  40. Viterbi(A,B,Pi,O)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值