2016-05-07 127 views
0

我有一个序列x = [12,14,6,15,15,15,15,6,8,8,18,18,14,14]所以我想做转换概率矩阵。通过方程计算的转换概率矩阵即概率=(对x(t)跟随x(t + 1))/(对x(t)跟随任何状态的数量)。矩阵应该有如下如何在Matlab中编程以获得转换概率矩阵?

    6  8 12  14  15  18 

      6  0  1/2 0  0  1/2  0 
      8  0  1/2 0  0  0  1/2 
      12  0  0 0  1  0  0 
      14 1/2  0 0  1/2  0  0 
      15 1/4  0 0  0  3/4  0 
      18  0  0 0  0  1/2 1/2 

通过下面的代码我可以做

m = max(x); 
n = numel(x); 
y = zeros(m,1); 
p = zeros(m,m); 
for k=1:n-1 
    y(x(k)) = y(x(k)) + 1; 
    p(x(k),x(k+1)) = p(x(k),x(k+1)) + 1; 
end 
p = bsxfun(@rdivide,p,y); p(isnan(p)) = 0; 

但这个码矩阵形式为了最大状态存在的顺序,即矩阵变为18 * 18的,以及更多的地方零发生。我想要矩阵像我上面发布如何做到这一点。

+0

是这不同于[你关于转移概率矩阵的其他未回答的问题](http://stackoverflow.com/questions/37054721/how-to-obtain-transition-probability-matrix-in-matrix)? –

+1

@AndrasDeak现在他想删除没有任何可能性的数字。 – xvan

+0

@Rams这个问题是不合适的,删除所有与转换概率生成有关的信息,因为它与18 * 18矩阵和目标矩阵无关。 – xvan

回答

-1
%%Sample matrix 
p=magic(8) 
%%Fill rows and cols 3,5 with 0's 
p([3 5],:)=0 
p(:,[3 5])=0 

%%The code 

lb=[] 
for k = [length(p):-1:1] 
    if any(p(k,:)) | any(p(:,k)) 
    lb=[ [k],lb ] 
    else 
    p(k,:)=[] 
    p(:,k)=[] 
    end 
end 

lb保持你的原始索引

+0

我试了一下,但我不明白,你可以给整个代码。 –

+0

该代码删除p的第n行和列,如果两者都只有0的 – xvan

+0

可以发布整个代码,从头到尾。 –

1

步骤1 - 组织数据和产生空的转换表

x= [12,14,6,15,15,15,15,6,8,8,18,18,14,14] 
xind = zeros(1,length(x)); 
u = unique(x) % find unique elements and sort 
for ii = 1:length(u) 
    xmask = x==u(ii); % locate all elements of a single value 
    xind = xind+ii*xmask; % number them in the order listed in u 
end 

输出被标记为马尔可夫链(元素标签,而不是有意义的值)

>> u 

u = 

    6  8 12 14 15 18 

>> xind 

xind = 

    3  4  1  5  5  5  5  1  2  2  6  6  4  4 

第2步 - 建立“从 - 到”表f或每跳

>> T = [xind(1:end-1);xind(2:end)] 

T = 

    3  4  1  5  5  5  5  1  2  2  6  6  4 
    4  1  5  5  5  5  1  2  2  6  6  4  4 

每一列都是一个过渡。第一行是“从”标签,第二行是“到”标签。

步骤3 - 计数频率和创建转换表

p = zeros(length(u)); 
for ii = 1:size(T,2) 
    px = T(1,ii); % from label 
    py = T(2,ii); % to label 
    p(px,py) = p(px,py)+1; 
end 

输出被聚集频率表。每个元素都是一跳的计数。行号是“from”,列号是“to”。

>> p 

p = 

    0  1  0  0  1  0 
    0  1  0  0  0  1 
    0  0  0  2  0  0 
    2  0  0  1  0  0 
    1  0  0  0  3  0 
    0  0  0  1  0  1 

例如,3装置从第五标签到第五标签3个转变(实际值1515

步骤4 - 正常化行向量获得的概率表

>> p./repmat(sum(p,2),1,length(u)) 

ans = 

     0 0.5000   0   0 0.5000   0 
     0 0.5000   0   0   0 0.5000 
     0   0   0 1.0000   0   0 
    0.5000   0   0 0.5000   0   0 
    0.2500   0   0   0 0.7500   0 
     0   0   0 0.5000   0 0.5000 

替代loop版本

for ii = 1:size(p,1) 
    count = sum(p(ii,:)); 
    p(ii,:) = p(ii,:)/count; 
end 
+0

但xind未定义,Matlab显示为'未定义函数或变量'xind'。 –

+0

已更新的代码来初始化索引数组。 – Yvon

+0

Matlab显示这样的错误'错误使用+ 矩阵尺寸必须一致。' –