HMM经典介绍论文【Rabiner 1989】翻译(十)——连续观测密度

4.1 连续观测密度

目前为止我们的讨论中只考虑了观测是离散值的情况,这种情况下对每个状态可以使用离散概率密度。但是存在一些应用离散值是连续信号(比如向量)。虽然可以通过码本把连续信号量化,但是这种量化可能存在严重的退化。所以希望HMM中可以用连续观测密度。

为了使用连续观测密度,必须对模型概率密度函数(probability density function, pdf)进行约束以使得pdf的参数可以通过一致的方法进行估计。最一般的pdf的表示是如下的有限混合形式:

bi(O)=m=1Mcjmf[O,μjm,Ujm],1jN(49)

其中 O 是被建模的向量, cjm 是在状态 j 的第m个混合的系数, f 是log-凹或者椭圆对称密度(比如高斯),μjm Ujm 分别为状态j下第m个混合的均值向量和协方差矩阵。一般 f 为高斯密度。混合增益cjm满足随机约束:

m=1Mcjm=1,1jN(50a)

cjm0,1jN,1mM(50b)

以使得pdf被正确归一化,即

bj(x)dx=1,1jN.(51)

(49)表示的pdf可以任意近地近似任一有限连续密度函数。所以可以用于解决很多问题。

混合密度系数的估计公式为

cjk¯=Tt=1γt(j,k)Tt=1Mk=1γt(j,k)(52)

μ¯jk=Tt=1γt(j,k)OtTt=1γt(j,k)(53)

U¯jk=Tt=1γt(j,k)(Otμjk)(Otμjk)Tt=1γ(tj,k)(54)

其中 表示向量转置,γt(j,k)是用第 k 个混合元素解释Ot 时, t 时刻状态为j的概率,即

γt(j,k)=αt(j)βt(j)Nj=1αt(j)βt(j)cjkf(Ot,μjk,Ujk)Mm=1cjmf(Ot,μjm,Ujm).

γt(j,k) 在只有一个混合的时候泛化为(26)中的 γt(j) aij 的估计表达式和离散观测密度时的一样((40b))。 cjk 的估计式是当使用第k个混合元素时系统在状态j的期望次数与系统在状态j的总期望次数的比例。类似地,均值向量 μ¯jk 的估计式是第k个混合元素对观测向量的贡献的期望比例。协方差矩阵 U¯jk 也有类似的解释。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
HMM是一种常见的统计模型,用于描述随机生成的序列。Viterbi算法是一种在HMM中进行解码的动态规划算法,用于寻找最可能的隐藏状态序列。下面是HMM的MATLAB实现,包括Viterbi算法。 首先,我们需要定义一个HMM模型。我们假设这个模型有3个隐藏状态和2个可见状态。我们使用矩阵A表示隐藏状态之间的转移概率,矩阵B表示每个隐藏状态生成每个可见状态的概率,向量pi表示初始隐藏状态的概率分布。 ```matlab % 定义HMM模型参数 A = [0.5 0.2 0.3; 0.3 0.5 0.2; 0.2 0.3 0.5]; B = [0.5 0.5; 0.4 0.6; 0.7 0.3]; pi = [0.2 0.4 0.4]; ``` 接下来,我们需要生成一个可见序列。我们使用HMM模型中的随机过程生成一个长度为10的可见序列。 ```matlab % 生成可见序列 T = 10; q = zeros(1, T); o = zeros(1, T); q(1) = randsrc(1, 1, [1:3; pi]); o(1) = randsrc(1, 1, [1:2; B(q(1), :)]); for t = 2:T q(t) = randsrc(1, 1, [1:3; A(q(t-1), :)]); o(t) = randsrc(1, 1, [1:2; B(q(t), :)]); end ``` 接下来,我们使用Viterbi算法解码这个可见序列,得到最可能的隐藏状态序列。我们定义一个矩阵V表示每个时间步的最大概率,以及一个矩阵path表示每个时间步的最大概率对应的前一个状态。 ```matlab % Viterbi算法解码 V = zeros(3, T); path = zeros(3, T); V(:, 1) = pi' .* B(:, o(1)); for t = 2:T for j = 1:3 [V(j, t), path(j, t)] = max(V(:, t-1) .* A(:, j)); V(j, t) = V(j, t) * B(j, o(t)); end end ``` 最后,我们找到最可能的隐藏状态序列。我们首先找到最后一个时间步的最大概率对应的隐藏状态,然后从后往前依次寻找每个时间步的最大概率对应的隐藏状态,最终得到整个隐藏状态序列。 ```matlab % 找到最可能的隐藏状态序列 [~, q(T)] = max(V(:, T)); for t = T-1:-1:1 q(t) = path(q(t+1), t+1); end ``` 完整代码如下: ```matlab % 定义HMM模型参数 A = [0.5 0.2 0.3; 0.3 0.5 0.2; 0.2 0.3 0.5]; B = [0.5 0.5; 0.4 0.6; 0.7 0.3]; pi = [0.2 0.4 0.4]; % 生成可见序列 T = 10; q = zeros(1, T); o = zeros(1, T); q(1) = randsrc(1, 1, [1:3; pi]); o(1) = randsrc(1, 1, [1:2; B(q(1), :)]); for t = 2:T q(t) = randsrc(1, 1, [1:3; A(q(t-1), :)]); o(t) = randsrc(1, 1, [1:2; B(q(t), :)]); end % Viterbi算法解码 V = zeros(3, T); path = zeros(3, T); V(:, 1) = pi' .* B(:, o(1)); for t = 2:T for j = 1:3 [V(j, t), path(j, t)] = max(V(:, t-1) .* A(:, j)); V(j, t) = V(j, t) * B(j, o(t)); end end % 找到最可能的隐藏状态序列 [~, q(T)] = max(V(:, T)); for t = T-1:-1:1 q(t) = path(q(t+1), t+1); end ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值