所以对于马尔可夫链,我假设你只对状态转换感兴趣.您可以将所有状态转换分组为单个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
要设置转换矩阵,您可以获取此处列出的建议,并计算所有转换的行数:
[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