在由不同步骤组成的在线流程中,我有完成流程的人员和退出的人员的数据。对于每个用户,数据由每个时间间隔的一系列处理步骤组成,比如说一秒钟。在
一个完整用户序列的例子是[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库hmmlearn和pomegranate,但我似乎无法创建一个小的工作示例来进行测试。我的一些测试代码和一些人工数据可以在下面找到:
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===>。。。==>;完成
每个状态都有一个最频繁的选择。 也有从任何状态到“失败”的过渡。在
因此,马尔可夫矩阵是稀疏的,类似于
相关问题 更多 >
编程相关推荐