如何在MATLAB中求出转移概率矩阵?

nwwlzxa7  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(590)

假设我有一个序列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)在状态i和状态x中(t+1)处于状态j)/(观察对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

转移概率矩阵由我手工计算如下

iih3973s

iih3973s1#

由于已经有一段时间了,我认为现在可以提供一个答案了。下面的两种方法都不需要工具箱。该方法假设离散时间马尔可夫链(DTMC)的转移概率矩阵的基本知识。
这两种方法都使用unique()函数来寻找状态空间。注意顺序是不同的,例如your [1 3 2 4 5] vs. my [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)-1P得行之与是否为1(sum(P,2)).

请注意,计数矩阵使用1步偏移量来计数转换。输出是转换数的NumU x NumU数组,以unique()n-输出中给出的索引表示。

    • 方法2:单个for环路**

这是一种可以使用状态空间的任何排序的直接方法(见下文)。

States = unique(X);   % <--- can be anything
                      % e.g. try: States = [1 3 2 4 5];

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];使用Approach 2,则生成的概率转移矩阵P与手动计算的概率转移矩阵相匹配。

相关问题