2

我正在嘗試在MATLAB中構建馬爾可夫鏈的轉移矩陣;我有幾個不同的觀察序列(所有不同的長度),我需要使用這些序列來生成轉換矩陣。在不同狀態序列長度下估計MATLAB中的馬爾可夫鏈轉移矩陣

Constructing a multi-order Markov chain transition matrix in Matlab向我展示瞭如何用單個觀測序列建立轉換矩陣。

我怎樣才能構建一個使用不同長度的觀測?一個例子可以是一個序列是1,2,3,4而另一個是4,5,6。有沒有辦法做到這一點,而不必循環所有的序列和計算的計數?

回答

4

因此,對於馬爾可夫鏈,我假設你只對狀態轉換感興趣。您可以將所有狀態轉換組合到一個Nx2矩陣中,然後計算一行出現的次數。

在這個例子中我使用長度爲4,3三個觀測,和3我可以通過以下方式在單一的矩陣使用cellfun到組中的所有狀態轉變一起:

obs = cell(1, 3); 

obs(1) = {[1 2 3 4]}; 
obs(2) = {[4 5 6]}; 
obs(3) = {[3 4 5]}; 

transitions = cellfun(@(x)([x(1:length(x)-1); x(2:length(x))]), obs, 'UniformOutput', false); 

alltransitions = cell2mat(transitions)'; 

哪給我我觀察到過渡(1->2, 2->3, 3->4 ...)

alltransitions = 

    1  2 
    2  3 
    3  4 
    4  5 
    5  6 
    3  4 
    4  5 

要建立過渡矩陣,你可以採取這裏列出的建議,並計算所有過渡的行:

http://www.mathworks.it/matlabcentral/answers/75009-i-ve-a-matrix-of-6x4-and-i-want-to-count-the-rows-how-many-times-it-occur-in-a-matrix

[uniqueTransitions, ~, i]=unique(alltransitions,'rows','stable'); 
v=arrayfun(@(x) sum(i==x),1:size(uniqueTransitions,1))'; 
p = v/sum(v); 

我的向量p包含我的轉移概率,這樣的話,我可以繼續前進,建立一個稀疏矩陣

transitionMatrix = sparse(uniqueTransitions(:,1), uniqueTransitions(:,2), p, 6,6) 

導致:

transitionMatrix = 

    (1,2)  0.1429 
    (2,3)  0.1429 
    (3,4)  0.2857 
    (4,5)  0.2857 
    (5,6)  0.1429 
0

這可能是一個更簡單計算給定數據序列(一個向量)的轉換概率矩陣(TPM)的方式如下:

myS = {S1,S2,S1,S3,...}與您擁有的狀態一樣多;

TPM = hmmestimate(myS,myS);

hmmestimate函數在MATLAB中的隱馬爾可夫模型下定義。

+0

當你有多個向量時,hmmestimate是否有效? – galtor

相關問題