python - 使用隐马尔可夫模型对数据流进行分类

标签 python machine-learning classification hidden-markov-models

问题

在由不同步骤组成的在线流程中,我拥有完成该流程的人员和退出流程的人员的数据。对于每个用户,数据由每个时间间隔(假设为一秒)的一系列处理步骤组成。

此类完整用户序列的示例为[1,1,1,1,2,2,2,3,3,3,3....-1] 用户在步骤 1 中停留四秒, 然后执行步骤 2 3 秒,执行步骤 3 4 秒,依此类推,然后到达过程结束(用 -1 表示)。 退出的一个示例是 [1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2],其中用户将在步骤 1 中花费过多的时间,然后在步骤 2 中花费 5 秒,然后关闭网页(因此不会到达末尾 (-1))

基于模型,我希望能够在线预测/分类(如“实时”)用户完成流程或退出的概率。

方法

我已经阅读了有关 HMM 的内容,并且我会应用以下原则:

  • 使用完成该过程的人员序列训练一个模型

  • 使用未完成该过程的人员序列训练另一个模型

  • 收集未见过的用户的传入数据流,并在每个时间步对每个模型使用前向算法来查看两个模型中的哪一个最有可能输出该流。相应的模型代表与该流关联的标签。

你的意见是什么?这可行吗?我一直在查看Python库hmmlearnpomegranate ,但我似乎无法创建一个小的工作示例来进行测试。下面可以找到我的一些测试代码和一些人工数据:

from pomegranate import *
import numpy as np

# generate data of some sample sequences of length 4
# mean and std of each step in sequence
means = [1,2,3,4] 
stds = [0.1, 0.1, 0.1, 0.1]
num_data = 100

data = []

for mean, std in zip(means, stds):
    d = np.random.normal(mean, std, num_data)
    data.append(d)

data = np.array(data).T
# create model (based on sample code of pomegranate https://github.com/jmschrei/pomegranate/blob/master/tutorials/Tutorial_3_Hidden_Markov_Models.ipynb)
s1 = State( NormalDistribution( 1, 1 ), name="s1" )
s2 = State( NormalDistribution( 2, 1 ), name="s2" )

model = HiddenMarkovModel()
model.add_states( [s1, s2] )
model.add_transition( model.start, s1, 0.5, pseudocount=4.2 )
model.add_transition( model.start, s2, 0.5, pseudocount=1.3 )

model.add_transition( s1, s2, 0.5, pseudocount=5.2 )
model.add_transition( s2, s1, 0.5, pseudocount=0.9 )
model.bake()
#model.plot()
# fit model
model.fit( data, use_pseudocount=False, algorithm = 'baum-welch', verbose=False )
# get probability of very clean sequence (mean of each step)
p = model.probability([1,2,3,4])
print p # 3.51e^-112

我预计这个非常干净的序列的概率会接近 1,因为这些值是每个步骤分布的平均值。我怎样才能使这个例子更好并最终将其应用到我的应用程序中?

担忧

我不确定我的模型应该包含哪些状态和转换。什么是“好”模型?您如何知道需要向模型添加更多状态,以在给定数据的情况下添加更具表现力的数据。石榴的教程很好,但不足以让我在这种情况下应用 HMM。

最佳答案

是的,HMM 是一种可行的方法来做到这一点,尽管它有点矫枉过正,因为 FSM 是一个简单的线性链。还可以根据每个字符串长度的平均值和变化来构建“模型”,您可以简单地比较部分字符串与每组参数的距离,并在每个所需的时间点重新检查。

状态很简单:

1 ==> 2 ==> 3 ==> ... ==> 完成

每个状态都有一个回到自身的循环;这是最常见的选择。 还有从任何状态到“失败”的转换。

因此,马尔可夫矩阵将是稀疏的,类似于

 1   2   3   4 done failed
0.8 0.1  0   0   0  0.1
 0  0.8 0.1  0   0  0.1
 0   0  0.8 0.1  0  0.1
 0   0   0  0.8 0.1 0.1
 0   0   0   0  1.0  0 
 0   0   0   0   0  1.0

关于python - 使用隐马尔可夫模型对数据流进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613386/

相关文章:

python - 访问 Matplotlib 文本对象标签文本

python - 聪明的基于流的 python 程序不会遇到无限递归

c++ - C++中的协同过滤库

python - 如何将一条推文输入分类器模型?

python - 用python更新elasticsearch查询

javascript - 如何使用selenium python点击链接

tensorflow - 如何在 TensorBoard 中解释 "Value Loss"图表?

python - 如何在sklearn中获得随机森林中的决策函数

machine-learning - 用于回归(时间序列预测)和分类的神经网络架构有什么区别吗?

artificial-intelligence - 3D图像数据集的特征提取