让我用一个示例来说明如何使用HMM 工具箱,而不是回答每个单独的问题——天气示例,通常在介绍隐藏马尔可夫模型时使用。
基本上,模型的状态是三种可能的天气类型:晴天、雨天和雾天。在任何一天,我们假设天气只能是这些值之一。因此,HMM 状态集是:
S = {sunny, rainy, foggy}
然而在这个例子中,我们不能直接观察天气(显然我们被锁在地下室了!)。相反,我们拥有的唯一证据是每天检查您的人是否带雨伞。在 HMM 术语中,这些是离散的观察结果:
x = {umbrella, no umbrella}
HMM 模型具有三个特点:
- 先验概率:处于序列第一个状态的概率向量。
- 转换概率:描述从一种天气状态到另一种天气状态的概率的矩阵。
- 发射概率:描述在给定状态(天气)下观察输出(是否有伞)的概率的矩阵。
接下来我们要么得到这些概率,要么我们必须从训练集中学习它们。一旦完成,我们就可以进行推理,例如计算观察序列相对于 HMM 模型(或一堆模型,并选择最可能的一个)的可能性......
1) 已知模型参数
下面是一个示例代码,展示了如何填充现有概率来构建模型:
Q = 3; %# number of states (sun,rain,fog)
O = 2; %# number of discrete observations (umbrella, no umbrella)
%# prior probabilities
prior = [1 0 0];
%# state transition matrix (1: sun, 2: rain, 3:fog)
A = [0.8 0.05 0.15; 0.2 0.6 0.2; 0.2 0.3 0.5];
%# observation emission matrix (1: umbrella, 2: no umbrella)
B = [0.1 0.9; 0.8 0.2; 0.3 0.7];
然后我们可以从这个模型中采样一堆序列:
num = 20; %# 20 sequences
T = 10; %# each of length 10 (days)
[seqs,states] = dhmm_sample(prior, A, B, num, T);
例如,第 5 个例子是:
>> seqs(5,:) %# observation sequence
ans =
2 2 1 2 1 1 1 2 2 2
>> states(5,:) %# hidden states sequence
ans =
1 1 1 3 2 2 2 1 1 1
我们可以评估序列的对数似然:
dhmm_logprob(seqs(5,:), prior, A, B)
dhmm_logprob_path(prior, A, B, states(5,:))
或计算维特比路径(最可能的状态序列):
vPath = viterbi_path(prior, A, multinomial_prob(seqs(5,:),B))
2)未知模型参数
训练是使用 EM 算法进行的,最好使用一组观察序列来完成。
继续同一个例子,我们可以使用上面生成的数据来训练一个新模型并将其与原始模型进行比较:
%# we start with a randomly initialized model
prior_hat = normalise(rand(Q,1));
A_hat = mk_stochastic(rand(Q,Q));
B_hat = mk_stochastic(rand(Q,O));
%# learn from data by performing many iterations of EM
[LL,prior_hat,A_hat,B_hat] = dhmm_em(seqs, prior_hat,A_hat,B_hat, 'max_iter',50);
%# plot learning curve
plot(LL), xlabel('iterations'), ylabel('log likelihood'), grid on
请记住,状态顺序不必匹配。这就是为什么我们需要在比较两个模型之前对状态进行置换。在此示例中,经过训练的模型看起来接近原始模型:
>> p = [2 3 1]; %# states permutation
>> prior, prior_hat(p)
prior =
1 0 0
ans =
0.97401
7.5499e-005
0.02591
>> A, A_hat(p,p)
A =
0.8 0.05 0.15
0.2 0.6 0.2
0.2 0.3 0.5
ans =
0.75967 0.05898 0.18135
0.037482 0.77118 0.19134
0.22003 0.53381 0.24616
>> B, B_hat(p,[1 2])
B =
0.1 0.9
0.8 0.2
0.3 0.7
ans =
0.11237 0.88763
0.72839 0.27161
0.25889 0.74111
您可以使用隐藏马尔可夫模型做更多的事情,例如分类或模式识别。您将拥有属于不同类别的不同观察序列集。您首先为每个集合训练一个模型。然后给定一个新的观察序列,您可以通过计算其对每个模型的似然性来对其进行分类,并预测具有最高对数似然的模型。
argmax[ log P(X|model_i) ] over all model_i