训练隐马尔可夫模型和分类用法的问题

时间:2012-03-16 06:50:45

标签: machine-learning computer-vision matlab hidden-markov-models

我正在努力弄清楚如何使用Kevin Murphy的 HMM工具箱Toolbox。如果有经验的人可以澄清一些概念性问题,那将是一个很大的帮助。我已经以某种方式理解了HMM背后的理论,但是如何实际实现它并提及所有参数设置令人困惑。

有两个班级,所以我们需要2个HMM。
假设训练向量是:class1 O1 = {4 3 5 1 2}和类O_2 = {1 4 3 2 4}。
现在,系统必须将未知序列O3 = {1 3 2 4 4}分类为class1或class2。

  1. 在obsmat0和obsmat1中会发生什么?
  2. 如何指定转换概率transmat0和transmat1的语法?
  3. 在这种情况下,可变数据是什么?
  4. 由于使用了五个唯一数字/符号,状态数Q = 5?
  5. 输出符号数= 5?
  6. 如何提及转换概率transmat0和transmat1?

2 个答案:

答案 0 :(得分:36)

不要回答每个问题,让我举例说明如何使用HMM toolbox作为示例 - 天气示例,这通常在引入隐藏马尔可夫模型时使用。

基本上,模型的状态是三种可能的天气类型:晴天,下雨和有雾。在任何一天,我们都假设天气只是这些值中的一个。因此,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);

例如,第五个例子是:

>> 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))

5th_example

2)未知模型参数

使用EM算法进行训练,最好使用 set 观察序列进行训练。

继续使用相同的示例,我们可以使用上面生成的数据来训练新模型并将其与原始模型进行比较:

%# 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

log_likelihood

请记住,州订单不必匹配。这就是我们在比较两种模型之前需要置换状态的原因。在此示例中,训练的模型看起来接近原始模型:

>> 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

使用隐藏的马尔可夫模型可以做更多的事情,例如分类或模式识别。你会有不同的obervation序列集属于不同的类。首先,训练每组的模型。然后给出一个新的观察序列,你可以通过计算每个模型的可能性来对其进行分类,并预测具有最高对数似然的模型。

argmax[ log P(X|model_i) ] over all model_i

答案 1 :(得分:1)

我不使用你提到的工具箱,但我确实使用HTK。有一本书非常清楚地描述了HTK的功能,免费提供

http://htk.eng.cam.ac.uk/docs/docs.shtml

介绍性章节可能有助于您理解。

我可以快速尝试回答您列表中的#4。 。 。 发射状态的数量与特征向量的长度和复杂性相关联。然而,它当然不必等于特征向量阵列的长度,因为每个发射状态可以具有返回到其自身或甚至回到先前状态的转换概率,这取决于架构。我也不确定你给出的值是否包括hmm开始和结束时的非发光状态,但这些也需要考虑。选择州的数量往往归结为反复试验。

祝你好运!