我正在尝试在 MATLAB 中为马尔可夫链构建转移矩阵;我有几个不同的观察序列(所有不同的长度),我需要使用它们生成转换矩阵。
在 Matlab 中构建多阶马尔可夫链转移矩阵向我展示了如何构建具有单个观察序列的转移矩阵。
如何使用不同长度的观察来构造一个?一个例子可以是一个序列是 1,2,3,4,另一个是 4,5,6。有没有办法做到这一点而不必循环遍历所有序列和计算计数?
我正在尝试在 MATLAB 中为马尔可夫链构建转移矩阵;我有几个不同的观察序列(所有不同的长度),我需要使用它们生成转换矩阵。
在 Matlab 中构建多阶马尔可夫链转移矩阵向我展示了如何构建具有单个观察序列的转移矩阵。
如何使用不同长度的观察来构造一个?一个例子可以是一个序列是 1,2,3,4,另一个是 4,5,6。有没有办法做到这一点而不必循环遍历所有序列和计算计数?
所以对于马尔可夫链,我假设你只对状态转换感兴趣。您可以将所有状态转换分组到一个 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
这可能是计算给定数据序列(一个向量)的转移概率矩阵(TPM)的更简单方法,如下所示:
myS = {S1,S2,S1,S3,...} 拥有尽可能多的状态;
TPM = hmmestimate(myS,myS);
hmmestimate函数是在 MATLAB 中的隐藏马尔可夫模型下定义的。