2013年6月23日日曜日

相関を持つ乱数の生成

相関を持つ正規分布な乱数を生成するためには、コレスキー分解を用いる。
下記はその確認用の matlab プログラム。

大きさ 1 を持つ N x 4 個の複素数の乱数 x を生成する。
実部・虚部それぞれが標準正規分布している。

また、4 列の列方向の乱数列どうしはそれぞれ独立である。
相関行列 corrcoef(x) の i,j 成分が対角成分以外ほぼ 0 になることから確認できる。

複素相関行列 R のコレスキー分解 chol(R) の下三角行列を x に乗算して、
相関のある乱数列 y を得ることができる。
y の相関行列 corrcoef(y) を計算すると、もとの R とほぼ等しくなっている。



N = 10000;

x = 1/sqrt(2) * (randn(N,4) + randn(N,4) * I);

corrcoef(x) # correlation matrix of y                                                                                   

r = [        1, -0.7+0.2I,  0.2+0.4I, -0.5+0.1I;
     -0.7-0.2I,         1,  0.3-0.2I,  0.4-0.2I;
      0.2-0.4I,  0.3+0.2I,         1,  0.3+0.1I;
     -0.5-0.1I,  0.4+0.2I,  0.3-0.1I,         1]

y = transpose(chol(r, 'lower') * transpose(x));

corrcoef(y) # correlation matrix of y