【问题标题】:Issue in training hidden markov model and usage for classification训练隐马尔可夫模型和分类使用中的问题
【发布时间】:2012-04-01 17:59:27
【问题描述】:

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

有 2 个类,所以我们需要 2 个 HMM。
假设训练向量是:class1 O1={ 4 3 5 1 2} 和​​ class 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?

【问题讨论】:

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


    【解决方案1】:

    我不回答每个单独的问题,而是通过一个示例来说明如何使用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);
    

    例如,第 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
    

    【讨论】:

    • 非常感谢您提供这些宝贵的信息。但是,关于将这个例子应用于我的问题,某些事情仍然不清楚。如果你能暗示我的情况应该是什么观察 O(对于伞和没有伞的情况听起来太可预测了,如果决定不是像伞一样的二进制),什么是置换矩阵 p?
    • @Amro 我有点惊讶,因为用于训练的序列似乎必须在矩阵中堆叠在一起。这意味着它们都需要具有相同的长度,不是吗?这不是不必要的条件吗?
    • @Konstantin:如果序列的长度不同(seqs{i}),train 函数也接受一个元胞数组,例如你可以使用:num2cell(seqs,2)
    • @Amro 你能解释一下为什么dhmm_em 在学习模型时不将states 作为参数吗?
    • @medvedNick: dhmm_em 实现Baum-Welch algorithm 以在仅给出排放数据时学习 HMM 模型。如果您知道可观察序列以及相应的隐藏状态,则应用直接计数来估计模型参数(计算每个符号从每个状态发出的次数,以及从一种状态转换到另一种状态的次数,然后对计数进行归一化以获得正确的概率)
    【解决方案2】:

    我不使用您提到的工具箱,但我使用 HTK。有一本书把HTK的功能描述的很清楚,免费提供

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

    介绍性章节可能会帮助您理解。

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

    祝你好运!

    【讨论】:

    • 感谢您的回复。但是,HTK 工具箱比这个更复杂!另外,在考虑状态数量时,我们是否包括那些存在自循环和来回转换的状态像遍历 HMM 模型中的那个?我不知道这个概念。如果你能用一个例子来解释不同的状态情况,那将是非常有帮助的。
    猜你喜欢
    • 2016-12-31
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2019-03-06
    • 1970-01-01
    • 2012-08-15
    • 2012-06-18
    相关资源
    最近更新 更多