0

マルコフ連鎖からのいくつかのシーケンスで構成される行列Xがあります。私には5つの州1、2、3、4、5があります。したがって、たとえば、行1はシーケンスであり、行2は別個の独立したシーケンスです。

    4   4   4   4   4   5   3   0   0   0
    1   4   2   2   2   2   3   4   0   0
x=  4   4   1   2   1   3   1   0   0   0
    2   4   4   2   4   3   3   5   0   0
    4   4   5   4   2   1   2   4   3   5

状態1..5間の遷移の数を数えたいのですが。すなわち。1to1、1to2、1to3、1to4、1to5。2to1など。例:1to1は0回発生します。ただし、4to4は6回発生します。など。ゼロは無視できます。ゼロはExcelファイルのインポートによるアーティファクトです。

たとえば、この質問ですが、シーケンスは連結されています。さらに詳しい説明が必要な場合はお知らせください。

4

2 に答える 2

3

必要なことを行うコードは次のとおりです。

N = max(max(X));                                   %# Number of states
[P, Q] = meshgrid(1:N, 1:N);
Y = [X, zeros(size(X, 1), 1)]';                    %# Pad for concatenation
count_func = @(p, q)numel(strfind(Y(:)', [p, q])); %# Counts p->q transitions
P = reshape(arrayfun(count_func, P, Q), N, N)

簡単な説明: すべての行Xを 1 つの長いベクトルYにします (隣接する行に不要な遷移がないようにパディングが必要です)。pandqは、状態遷移のすべての可能な組み合わせを保持し、特定のandcount_funcの遷移の数をカウントします。と のすべての可能な組み合わせを呼び出し、それに応じて行列を生成します。Ypqarrayfuncount_funcpqP

あなたの例では、このコードは matrix を生成しますP:

P =
     0   2   1   1   0
     2   3   0   3   0
     1   1   1   2   1
     1   3   1   7   1
     0   0   2   2   0

ここで、 はm番目の状態からnP(m, n)番目の状態への遷移回数を示します。


編集:フォローアップの質問のように、2 段階の遷移行列 (つまり、i番目の状態 → j番目の状態 → icount_func番目の状態) を見つけることに興味がある場合は、次のようにわずかに変更する必要があります。それで:

count_func = @(p, q)numel(strfind(Y(:)', [p, q, p]));

これにより、次の結果が得られます。

P =

   0   1   0   0   0
   1   2   0   1   0
   1   0   0   0   0
   0   0   0   3   0
   0   0   0   1   0
于 2012-09-16T00:06:41.170 に答える
1

別の解決策:

%# Define the example data:
x = [
4 4 4 4 4 5 3 0 0 0
1 4 2 2 2 2 3 4 0 0
4 4 1 2 1 3 1 0 0 0
2 4 4 2 4 3 3 5 0 0
4 4 5 4 2 1 2 4 3 5
];

%# Number of different states.
N = max(max(x));

%# Original states.
OrigStateVector = repmat((1:N)', N, 1);

%# Destination states corresponding to OrigStateVector.
DestStateVector = reshape(repmat((1:N)', 1, N)', N^2, 1);

%# Pad rows of x with zeros and reshape it to a horizontal vector.
xVector = reshape([ x, zeros(size(x,1),1) ]', 1, numel(x)+size(x,1));

%# Compute the number of state transitions and store the result in ResultMatrix.
ResultMatrix = reshape(cellfun(@(z) numel(z), arrayfun(@(x,y) strfind(xVector, [x y]), OrigStateVector, DestStateVector, 'UniformOutput', false)), N, N)';

ResultMatrix =
 0     2     1     1     0
 2     3     0     3     0
 1     1     1     2     1
 1     3     1     7     1
 0     0     2     2     0
于 2012-09-17T08:00:23.463 に答える