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

时间:2016-11-15 15:15:13

标签: 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。

1 个答案:

答案 0 :(得分:0)

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

状态很简单:

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

每个州都有自己的循环;这是最常见的选择。 任何州都有“失败”的过渡。

因此,Markov矩阵将是稀疏的,类似于

 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