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

2024-04-25 07:34:40 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

在由不同步骤组成的在线流程中,我有完成流程的人员和退出的人员的数据。对于每个用户,数据由每个时间间隔的一系列处理步骤组成,比如说一秒钟。在

一个完整用户序列的例子是[1,1,1,1,2,2,2,3,3,3,3....-1],其中用户在步骤1中持续4秒, 然后是第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))

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

接近

我已经读过HMMs,我将应用以下原则:

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

  • 使用未完成流程的人员序列培训另一个模型

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

你的意见是什么?这可行吗?我一直在研究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。在


Tags: of数据用户模型adddatamodel人员
1条回答
网友
1楼 · 发布于 2024-04-25 07:34:40

是的,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

相关问题 更多 >

    热门问题