假设我有一个序列x = 1,3,3,1,2,1,4,2,3,1,4,2,4,4,4,3,1,2,5,1和它有五个状态1 3 2 4 5.我必须通过这个等式在MATLAB中获得转移概率矩阵,概率=(观察对的数量x(t)& x(t + 1),其中x(t)处于状态状态j中的i和x(t + 1)/(观察对的数量x(t)& x(t + 1),其中x(t)处于状态i,x(t + 1)处于任何一个状态国家1 ...... s)。 我试过这段代码,但它给出了错误
x=[1 3 3 1 2 1 4 2 3 1 4 2 4 4 4 3 1 2 5 1]
n = length(x)-1
p = zeros(5,5)
for t = 1:n
if x(t)=x(t+1);
a(t)=count (x(t)=x(t+1)) % Here i am trying to count how many number of times pair of that states occur in sequence.
q(t)=sum(x==x(t)) % (Here i am trying to count Number of observation pairs x(t) & x(t+1), with x(t) in state i and x(t+1) in any one of the states 1......s)
end
for i=1:5
p(i, :) = a(t)/q(t)
end
由我手动计算的转移概率矩阵如下
1 3 2 4 5
1 0 1/5 2/5 2/5 0
3 3/4 1/4 0 0 0
2 1/4 1/4 0 1/4 1/4
4 0 1/5 2/5 2/5 0
5 1 0 0 0 0
答案 0 :(得分:0)
由于已经有一段时间了,所以我认为现在对此提供答案是安全的。以下两种方法均不需要工具箱。假设transition probability matrix中Discrete Time Markov Chain (DTMC)的基本知识。
两种方法都使用unique
函数来查找状态空间。请注意,顺序是不同的,例如您的[1 3 2 4 5]
与我的[1 2 3 4 5]
,但这不是限制性问题。我将获取过渡计数与过渡概率分开了,以说明一些技巧。
方法1:矢量化方法
这种方法使用unique
和accumarray
函数。
% MATLAB 2018b
X =[1 3 3 1 2 1 4 2 3 1 4 2 4 4 4 3 1 2 5 1];
[u,~,n] = unique(X);
NumU = length(u); % Number of Unique Observations
Counts = accumarray([n(1:end-1),n(2:end)],1,[NumU,NumU]);
P = Counts./sum(Counts,2); % Probability transition matrix
验证:您可以验证sum(sum(Counts)) == length(X)-1
和P
的行总和为一个(sum(P,2)
)。
请注意,计数矩阵使用1步偏移量对转换进行计数。输出是NumU x NumU
的{{1}}输出中的n
数组,该数组的数量取决于索引。
方法2:单个unique
循环
这是一种直接方法,可以使用状态空间的任何顺序(请参见下文)。
for
使用状态空间排序:如果您将方法2 与States = unique(X);
Counts = zeros(length(States));
for k = 2:length(X)
Counts(find(X(k-1) == States),find(X(k) == States)) = ...
Counts(find(X(k-1) == States),find(X(k) == States)) + 1;
end
P = Counts./sum(Counts,2); % Probability transition matrix
一起使用,则结果概率转换矩阵States = [1 3 2 4 5];
与您所选择的匹配手动计算。