簡體   English   中英

使用隱藏的Markov模型對數據流進行分類

[英]Classify stream of data using hidden markov models

問題

在包含不同步驟的在線流程中,我獲得了完成流程的人員和輟學人員的數據。 每個用戶的數據由每個時間間隔的一系列處理步驟組成,比如說一秒鍾。

這樣一個完整用戶序列的示例為[1,1,1,1,2,2,2,3,3,3,3....-1] ,其中用戶在第1步中有四個秒,然后執行步驟2持續三秒,然后執行步驟3持續四秒,以此類推,直到到達過程結束(以-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。

是的,盡管FSM是一條簡單的線性鏈,但是HMM是個可行的方法,盡管有點過頭了。 還可以根據每個字符串長度的均值和變化來構建“模型”,並且您可以簡單地將部分字符串的距離與每個參數集進行比較,並在每個所需的時間點進行重新檢查。

狀態很簡單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM