用不同状态序列长度估计MATLAB中的马尔可夫链转移矩阵

rad*_*ika 3 matlab probability markov-chains transitions hidden-markov-models

我正在尝试在MATLAB中构建马尔可夫链的转移矩阵; 我有几个不同的观察序列(所有不同的长度),我需要使用那些生成转换矩阵.

在Matlab构造多阶马尔可夫链转移矩阵向我展示了如何用单个观察序列构建转移矩阵.

如何使用不同长度的观察构建一个?一个例子可以是一个序列是1,2,3,4而另一个是4,5,6.有没有办法做到这一点,而不必循环所有序列和计算计数?

Hug*_*not 5

所以对于马尔可夫链,我假设你只对状态转换感兴趣.您可以将所有状态转换分组为单个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)';
Run Code Online (Sandbox Code Playgroud)

这给了我观察到的过渡(1->2, 2->3, 3->4 ...):

alltransitions =

     1     2
     2     3
     3     4
     4     5
     5     6
     3     4
     4     5
Run Code Online (Sandbox Code Playgroud)

要设置转换矩阵,您可以获取此处列出的建议,并计算所有转换的行数:

http://www.mathworks.it/matlabcentral/answers/75009-i-ve-a-matrix-of-6x4-and-i-want-to-count-the-rows-how-many-times-it-发生功能于一个矩阵

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

我的向量p包含我的转移概率,因此我可以继续构建一个稀疏矩阵

transitionMatrix = sparse(uniqueTransitions(:,1), uniqueTransitions(:,2), p, 6,6)
Run Code Online (Sandbox Code Playgroud)

这导致:

transitionMatrix =

   (1,2)       0.1429
   (2,3)       0.1429
   (3,4)       0.2857
   (4,5)       0.2857
   (5,6)       0.1429
Run Code Online (Sandbox Code Playgroud)