2017-10-10 69 views
0

生成馬爾科夫轉移矩陣想象我有一系列的4個可能的狀態馬爾可夫(A,B,C,d):在Python

X = [A, B, B, C, B, A, D, D, A, B, A, D, ....] 

怎樣才能使用Python馬爾可夫變換矩陣?矩陣必須是4乘4,表示從每個狀態移動到其他3個狀態的概率。 我一直在看很多例子,但在所有這些例子中,矩陣是給出的,而不是基於數據計算的。 我也看着hmmlearn,但是我沒有看到如何讓它吐出轉換矩陣。有沒有可以用於此目的的圖書館?

這裏是我想在Python做確切的事情的R代碼: https://stats.stackexchange.com/questions/26722/calculate-transition-matrix-markov-in-r

+0

在原料Python中,你需要使用一個列表的列表。這種事情更自然地用'numpy'或'pandas'完成。如果你想使用這些工具之一,也許你可以添加適當的標籤。無論如何,你的問題的輸入是什麼?一個有限的狀態列表? –

回答

4

這可能給你一些想法:

transitions = ['A', 'B', 'B', 'C', 'B', 'A', 'D', 'D', 'A', 'B', 'A', 'D'] 

def rank(c): 
    return ord(c) - ord('A') 

T = [rank(c) for c in transitions] 

#create matrix of zeros 

M = [[0]*4 for _ in range(4)] 

for (i,j) in zip(T,T[1:]): 
    M[i][j] += 1 

#now convert to probabilities: 
for row in M: 
    n = sum(row) 
    if n > 0: 
     row[:] = [f/sum(row) for f in row] 

#print M: 

for row in M: 
    print(row) 

輸出:

[0.0, 0.5, 0.0, 0.5] 
[0.5, 0.25, 0.25, 0.0] 
[0.0, 1.0, 0.0, 0.0] 
[0.5, 0.0, 0.0, 0.5] 

On編輯這是一個實現上述想法的功能:

#the following code takes a list such as 
#[1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1] 
#with states labeled as successive integers starting with 0 
#and returns a transition matrix, M, 
#where M[i][j] is the probability of transitioning from i to j 

def transition_matrix(transitions): 
    n = 1+ max(transitions) #number of states 

    M = [[0]*n for _ in range(n)] 

    for (i,j) in zip(transitions,transitions[1:]): 
     M[i][j] += 1 

    #now convert to probabilities: 
    for row in M: 
     s = sum(row) 
     if s > 0: 
      row[:] = [f/s for f in row] 
    return M 

#test: 

t = [1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1] 
m = transition_matrix(t) 
for row in m: print(' '.join('{0:.2f}'.format(x) for x in row)) 

輸出:

0.67 0.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.50 0.12 0.12 0.25 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 
0.00 0.00 0.00 0.50 0.50 0.00 0.00 0.00 0.00 
0.00 0.20 0.00 0.00 0.20 0.60 0.00 0.00 0.00 
0.17 0.17 0.00 0.00 0.17 0.33 0.00 0.17 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 
0.00 0.33 0.00 0.00 0.00 0.33 0.00 0.00 0.33 
+0

謝謝,約翰。唯一的問題是你的代碼產生的轉換矩陣並不完全是馬爾可夫轉換矩陣。你的代碼將行單元除以n = 11。無論如何,您可以方便地修復代碼,以便在添加到問題**「更新」**部分的屏幕截圖中顯示錶格。 – st19297

+1

@ st19297我剛剛用特定於行的'n'替換了全局'n'(使得輸入條件概率)。由於我不喜歡用0來除,所以上面的代碼留下一行零不變。當沒有觀察到來自該狀態的轉變時,估計來自給定狀態的轉移概率是不可能的。 –