多変量正規分布からサンプルを描画するためのコレスキー対固有分解


16

サンプルを描きたいです。ウィキペディアは、コレスキーまたは固有分解を使用することを推奨しています。つまり、 または Σ = D 1 D T 1xN(0,Σ)Σ=D1D1TΣ=QΛQT

したがって、サンプルは次の方法で描画できます。 または ここで、 x=D1vx=QΛvvN(0,I

ウィキペディアでは、どちらもサンプルの生成に同等に適していると示唆していますが、コレスキー法の方が計算時間が高速です。これは本当ですか?特に数値的に、モンテカルロ法を使用する場合、対角線に沿った分散が数桁異なる場合がありますか?この問題に関する正式な分析はありますか?


1
Damienは、どのプログラムがより高速かを確認するための最良のレシピは、ソフトウェアで自分でチェックすることです。コレスキー分解関数と固有分解関数は、実装によって速度が異なる場合があります。コレスキーの方法はより一般的ですが、固有の方法は固有の方法の方が柔軟性が高い可能性があります。
ttnphns

1
コレスキーは 3/3(Wikipedia)より高速であるのに対し、固有分解は(Jacobi Eigenvalue Algorithmであると理解しています。しかし、さらに2つの問題があります。 ?(2)分散は数桁だけ異なる( VS最も極端な要素のための) -これは、選択されたアルゴリズムにベアリングがありますか?ON3/3ON3 10 9104109
ダミアン

@Damien "より柔軟"な側面の1つは、共分散行列のSVDに対応する固有分解を切り捨てて、完全な行列の最適な低ランク近似を取得できることです。切り捨てられたSVDは、完全なものを計算してから小さな固有値を捨てるのではなく、直接計算できます。
GeoMatt22

Stack Overflowで答えを読んでみてはいかがですか:楕円共分散プロット(で作成されたcar::ellipse)で楕円の頂点を取得します。質問は異なるアプリケーションで尋ねられますが、背後にある理論は同じです。幾何学的な説明のための素敵な数字が表示されます。
李哲源

回答:


12

この問題は、アルゴリズムの一部として多変量正規分布から(決定論的)サンプルを引き出すUnscented Kalman FilterについてStraka et.alによって研究されました。運が良ければ、結果はモンテカルロ問題に適用できるかもしれません。

コレスキー分解(CD)および固有分解(ED)-さらに、実際の行列平方根(MSR)は、すべて正の半正定行列(PSD)を分解する方法です。

PSD行列のSVD考えます。PはPSDであるため、これは実際にはP = U S U Tの EDと同じです。:また、我々は、その平方根で対角行列を分割することができ、P = U P=うんSVTP=うんSうんT、それに注意P=うんSSTうんTS=ST

ここで、任意の直交行列導入できます。O

P=うんSOOTSTうんT=うんSOうんSOT

の選択は、特に共分散行列の強い非対角要素がある場合に、推定パフォーマンスに実際に影響します。O

この論文では、 3つの選択肢を検討しました。O

  • 、これはEDに対応します。O=
  • UQR分解からO=Q、これはCDに対応します。そしてうんS=QR
  • は対称行列(つまりMSR)を導きますO=うんT

多くの分析(引用)の後に、論文から次の結論が導き出されました。

  • 相関のない要素を持つ変換されるランダム変数の場合、考慮される3つのMDはすべて同じシグマポイントを提供するため、[Unscented Transform]近似の品質にほとんど違いはありません。そのような場合、低コストのためにCDが好まれます。

  • ランダム変数に相関要素が含まれる場合、異なる[分解]を使用すると、変換されたランダム変数の平均または共分散行列の[無香変換]近似の品質に大きく影響する可能性があります。上記の2つのケースは、[ED]が優先されるべきであることを示しました。

  • 変換される変数の要素が強い相関を示し、対応する共分散行列がほぼ特異な場合、MDを計算するアルゴリズムの数値安定性である別の問題を考慮する必要があります。SVDは、ChDよりもほとんど特異な共分散行列に対して数値的に安定しています。

参照:

  • ストラカ、O .; Dunik、J .; Simandl、M.&Havlik、J.「無香料のカルマンフィルターにおけるマトリックス分解の側面と比較」、American Control Conference(ACC)、2013、2013、3075-3080。

6

Rを使用して2つの方法の計算時間を比較する簡単な例を示します。

library(mvtnorm)
library(clusterGeneration)
set.seed(1234)
mean <- rnorm(1000, 0, 1)
sigma <- genPositiveDefMat(1000)
sigma <- sigma$Sigma

eigen.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "eigen")
  )

chol.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "chol")
  )

実行時間は

> eigen.time
   user  system elapsed 
   5.16    0.06    5.33 
> chol.time
   user  system elapsed 
   1.74    0.15    1.90

サンプルサイズを10000に増やすと、実行時間は

> eigen.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "eigen")
+   )
> 
> chol.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "chol")
+   )
> eigen.time
   user  system elapsed 
   15.74    0.28   16.19 
> chol.time
   user  system elapsed 
   11.61    0.19   11.89 

お役に立てれば。


3

マニュアル、または貧乏人向けの、自分で証明するデモを次に示します。

> set.seed(0)
> # The correlation matrix
> corr_matrix = matrix(cbind(1, .80, .2, .80, 1, .7, .2, .7, 1), nrow=3)
> nvar = 3 # Three columns of correlated data points
> nobs = 1e6 # One million observations for each column
> std_norm = matrix(rnorm(nvar * nobs),nrow=nobs, ncol=nvar) # N(0,1)   

コア=[1.8.2.81。7.2。71]

N=[[1][2][3][1]1.08063380.65639130.8400443[2]1.14342410.17297380.9884772[999999]0.48618270.035630062.1176976[1000000]0.43945511.692655171.9534729]

1. SVDメソッド:

[うん[3×3]Σ0.5[d1000d2000d3]NT[3×106]]T
> ptm <- proc.time()
> # Singular Value Decomposition method:
> svd = svd(corr_matrix)   
> rand_data_svd = t(svd$u %*% (diag(3) * sqrt(svd$d)) %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.29    0.05    0.34 
> 
> ptm <- proc.time()

2.コレスキー方式:

[Ch[c1100c21c220c31c32c33]NT[3×106]]T
> # Cholesky method:
> chole = t(chol(corr_matrix))
> rand_data_chole = t(chole %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.25    0.03    0.31 

@ userr11852に感謝しますmicrobenchmark。関数を使用してSVDとコレスキーのパフォーマンスの違いを計算するより良い方法があります。彼の提案で、ここに結果があります:

microbenchmark(chol(corr_matrix), svd(corr_matrix))
Unit: microseconds
              expr     min     lq      mean  median      uq     max neval cld
 chol(corr_matrix)  24.104  25.05  28.74036  25.995  26.467  95.469   100  a 
  svd(corr_matrix) 108.701 110.12 116.27794 111.065 112.719 223.074   100   b

@ user11852ありがとう。エントリをざっと読んだだけで、microbenchmark本当に違いが出ます。
アントニ・パレラダ

確かに、それは推定パフォーマンスに違いがありますか?
ダミアン

いい視点ね。パッケージを探索する時間がありませんでした。
アントニ・パレラダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.