2016-05-07 3 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でプログラミングする方法は?

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; 

が、配列中に存在するため、最大の状態のこのコード行列の形で行うことができ、コードを以下により

    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 

以下のようにする必要があり18 * 18のなり、より多くの場所ゼロが発生する。私は上記のような行列が私にそれを行う方法を掲載したい。

+0

Isこれは[あなたの他の未確認の質問についての遷移確率行列]とは異なります(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 - "from-to"テーブルを作成する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 

各列はトランジションです。最初の行は「from」ラベル、2番目の行は「to」ラベルです。

ステップ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は5ラベルの第5ラベルから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 

確率テーブルを取得する行ベクトルを正規化する代替手段をループバージョン

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

xindは定義されていませんが、Matlabはこのように '未定義の関数または変数' xind 'のように表示されます。 –

+0

インデックス配列を初期化するコードが更新されました。 – Yvon

+0

Matlabはこのようなエラーを表示しています '+ マトリックス寸法が一致している必要があります。 –

関連する問題