2015-11-17 52 views
0

我試圖通過一個類的馬爾可夫模型的多重轉換來運行數據框架。Markov模型的多重轉換

數據幀是這樣的:

df = pd.DataFrame({'Bull Market': [.9, .8, .5], 
        'Bear Market': [.25, .05, .25], 
        'Stagnant Market': [.75, .15, .25] 
        }, 
        index=["Bull Market", "Bear Market", "Stagnant Market"]) 

我有這樣的代碼,通過兩次運行它:

print(df.dot(df)) 

我需要通過模型X次運行它。我很難在dot()上找到文檔,但根據我的發現,似乎沒有可以將它運行X次。

任何幫助將不勝感激,謝謝!

回答

0

這不是馬爾可夫鏈的工作方式。您需要一個起始狀態(在這種情況下,[1,0,0],[0,1,0]或[0,0,1]),然後您將轉換矩陣乘以狀態向量,然後將轉換矩陣乘以新獲得的狀態向量,等等。您不會將轉換矩陣自身相乘。如果您需要了解在特定數量的轉換後發生了什麼,您可以循環X次並執行X矩陣向量乘法。如果你想要穩定狀態,你需要找到主要的特徵向量,你可以使用numpy.linalg.eig。還要注意,這不適用於你有的轉換矩陣,因爲這些行不是概率分佈。

編輯:好吧,我想我明白你想要做什麼。由於矩陣向量乘法的工作方式,您還可以對矩陣求冪,然後將其乘以起始狀態向量,並獲得相同的結果,就像迭代乘以每個中間結果一樣。你可以使用numpy.linalg.matrix_power來做到這一點。我看到你從維基百科獲得了這個矩陣。你只是混淆了其中一些數字,即應該是0.025,而不是0.25。它的關鍵,每一行總計爲1

此代碼維基百科再現例如:

import numpy as np 

T = np.array([[0.9, 0.075, 0.025], 
       [0.15, 0.8, 0.05], 
       [0.25, 0.25, 0.5]]) 
start = np.array([0, 1, 0]) 

def find_state_after_n(start, T, n): 
    Tmult = np.linalg.matrix_power(T, n) 
    state = np.dot(start, Tmult) 
    return state 

find_state_after_n(start, T, 3) 

array([ 0.3575 , 0.56825, 0.07425]) 
+0

感謝您的幫助。我創建了矩陣,基於一個圖表,我用三個不同的項目/列(我不知道正確的術語)給我的課程。我給出的示例問題只有兩個,所以我很困惑將三個列矩陣放在一起以便等於1.我的設置工作等於1,而不是像您提到的那樣按照正確的順序。我會審查你的代碼以及你找到的維基百科條目。在我給出的例子中,另外一個註釋是列等於1而不是行。我將繼續研究更多這方面的實例。 –

+0

它實際上工作的任何一種方式。如果你使用這個矩陣的轉置,所以列總和爲1而不是行,你只需要乘以然後,即上面改變'state = np.dot(start,Tmult)'到'state = np.dot( Tmult,開始)'。 –