使用石榴:如何在隐马尔可夫模型

时间:2018-06-02 19:07:44

标签: python hidden-markov-models unsupervised-learning markov

为了训练HMM模型,我需要开始概率(pi),转移概率和发射概率。现在我想训练一个具有3个状态(1,2,3)和4个输出(a,b,c,d)的HMM模型。培训数据是:

[[abcdabcdabcdabcdabcdbacbacd,abababcdcdcdcdababab,badcacdabacdbbacd,dacdbacdbbccaaadacdbabd,cababcacdbacacdbdacdacdbacdbab,acddbaacbdcaabdcbabd,cdbadcbacdbbdacdbcdaaabd,bcadabbacbacdbdacddb]]

我正在尝试使用石榴来做到这一点,但在这个例子中,所有州的概率都是这样指定的:

rainy = State( DiscreteDistribution({ 
    'walk': 0.1, 'shop': 0.4, 'clean': 0.5 }),
    name='Rainy' )
sunny = State( DiscreteDistribution({ 
    'walk': 0.6, 'shop': 0.3, 'clean': 0.1 }), 
    name='Sunny' )`

我的问题是如何获得概率。我正在尝试使用石榴方法model.add_transition(),但我不知道应该给哪个参数?有没有可以教我如何获得数据概率的例子?

2 个答案:

答案 0 :(得分:0)

石榴是一种工具,可以为您提供使用HMM建模的序列的状态标签(或概率)。鉴于您给出了初始转换概率,基于您对该问题的领域知识的排放概率,石榴可以为您计算出“开始概率”,“过渡概率”和“排放概率”。 This是使用石榴的HMM的一个很好的起点。

答案 1 :(得分:0)

如果您不知道所需模型的参数,即您想使用模型来学习那些参数,那么在无监督的设置下,您可以使用石榴中的fit()函数。      model = HiddenMarkovModel() #create reference model.fit(sequences, algorithm='baum-welch') # let model fit to the data model.bake() #finalize the model (注意:确保要输入的每个序列都是列表或numpy数组)

一旦模型学习了参数,就可以使用以下函数提取结果:

  1. 获得过渡概率矩阵:

    model.dense_transition_matrix()

  2. 获得排放分布:

    print(model)

  3. 然后,如果您希望使用模型来生成样本:

    model.sample(length=10)

  4. 您可以根据需要通过使用上面的过渡和发射参数进行调整并通过以下方法创建新模型来进一步改进模型:

    custom_model = HiddenMarkovModel.from_matrix(transition_matrix, distributions, start_probs, end_probs)

石榴docs是获取每个功能的详细信息的最佳来源。