首页 > 解决方案 > 使用石榴:如何在隐马尔可夫模型中生成概率

问题描述

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

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

我正在尝试使用 pomegranate 来做到这一点,但在示例中,所有州的概率都指定如下:

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(),但我不知道我应该给哪个参数?是否有任何示例可以教我如何获取数据中的概率?

标签: pythonhidden-markov-modelsunsupervised-learningmarkov

解决方案


如果您不知道所需模型的参数,即您想使用模型来学习这些参数,那么在无监督设置中,您可以使用fit()pomegranate 中的函数。 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)

Pomegranate docs是获取这些函数的详细信息的最佳来源。


推荐阅读