다변량 정규 분포에서 표본을 추출하기위한 hole 레 스키 대 고유 분해


16

샘플 싶습니다 . Wikipediahole 레 스키 (Cholesky) 또는 고유 분해 (Eigendecomposition) , 즉 Σ = D 1 D T 1 또는 Σ = Q Λ Q TxN(0,Σ)Σ=D1D1TΣ=QΛQT

따라서 샘플은 다음을 통해 그릴 수 있습니다 : 또는 x = Q x=D1v 여기서 vN(0,I)x=QΛvvN(0,I)

Wikipedia는 샘플 생성에 똑같이 우수하지만 Cholesky 방법은 계산 시간이 더 빠르다고 제안합니다. 이것이 사실입니까? 특히 몬테카를로 (Monte-carlo) 방법을 사용하는 경우 대각선을 따라 분산이 몇 자릿수 정도 다를 수있는 숫자는 무엇입니까? 이 문제에 대한 공식적인 분석이 있습니까?


1
어떤 프로그램이 더 빠른지 확인하는 가장 좋은 방법은 Damien, 소프트웨어에서 직접 확인하는 것입니다. Cholesky 및 고유 분해 기능은 구현에 따라 속도가 다를 수 있습니다. Cholesky 방식은 AFAIK보다 인기가 있지만 고유 방식은 잠재적으로 더 유연 할 수 있습니다.
ttnphns 2016 년

1
내가 콜레 빠른 것으로 이해 ( 위키 백과 ) eigendecomposition 인 반면 O ( N 3 ) ( 코비 고유치 알고리즘 그러나, 나는이 더 문제가 있습니다.? (1) 무엇을 "잠재적으로 더 유연"평균과 (2) 차이가 크기 (몇 배 차이가 10 - 410 - 9 극한 요소) -이 선택된 알고리즘에 베어링 있는가O(N3/3)O(N3)104109
데미안

"더 융통성있는"의 한 측면은 공분산 행렬에 대해 SVD에 대응하는 고유 분해 가 절단되어 전체 행렬의 최적의 낮은 순위 근사값을 얻을 수 있다는 것입니다. 잘린 SVD는 전체를 계산 한 다음 작은 고유 값을 버리지 않고 직접 계산할 수 있습니다.
GeoMatt22

어떻게 독서에 대한 내 대답을 스택 오버플로 : 타원 공분산 플롯에 타원의 정점을 얻습니다 (만든 car::ellipse) . 질문은 다른 응용 프로그램에서 요구되지만 배후 이론은 동일합니다. 당신은 거기에 기하학적 설명을위한 좋은 인물을 볼 수 있습니다.
李哲源

답변:


12

이 문제는 Straka 등이 알고리즘의 일부로 다변량 정규 분포에서 (결정적) 샘플을 추출 하는 Unscented Kalman Filter 에 대해 연구했습니다. 운이 좋으면 결과가 몬테카를로 문제에 적용될 수 있습니다.

Cholesky Decomposition (CD)과 Eigen Decomposition (ED)은 실제 매트릭스 제곱근 (MSR)은 모두 양의 반정의 매트릭스 (PSD)를 분해 할 수있는 모든 방법입니다.

PSD 매트릭스 의 SVD , 고려하십시오 . P는 PSD이기 때문에,이 실제로 ED와 동일하다 P = U S U T . 또한 대각선 행렬을 제곱근으로 나눌 수 있습니다 : P = U P=USVTP=USUT,P=USSTUT.S=ST

이제 임의의 직교 행렬 도입 할 수 있습니다 .O

.P=USOOTSTUT=(USO)(USO)T

의 선택은 실제로 특히 공분산 행렬의 대각선을 벗어난 요소가 강한 경우 추정 성능에 영향을줍니다.O

이 논문은 세 가지 선택을 연구했다 .O

  • ED에 해당하는 O = I ;O=I
  • 로부터QR 분해 U O=Q, 이는 CD에 해당하고; 과US=QR
  • 대칭 행렬 (즉, MSR)로 이어지는 O = U TO=UT

많은 분석 (견적) 후 논문에서 다음 결론이 도출되었습니다.

  • 상관 관계가없는 요소를 갖는 변형 될 랜덤 변수의 경우, 고려되는 3 개의 MD는 모두 동일한 시그마 포인트를 제공하므로 [Unscented Transform] 근사치의 품질에 거의 차이가 없습니다. 이러한 경우, CD는 저렴한 비용으로 선호 될 수 있습니다.

  • 랜덤 변수에 상관 된 요소가 포함 된 경우, 다른 [분해]를 사용하면 변환 된 랜덤 변수의 평균 또는 공분산 행렬의 [Unscented Transform] 근사 품질에 큰 영향을 줄 수 있습니다. 위의 두 경우는 [ED]가 선호되어야한다는 것을 보여 주었다.

  • 변형 될 변수의 요소들이 강한 상관 관계를 나타내어 대응하는 공분산 행렬이 거의 단수 인 경우, MD를 계산하는 알고리즘의 수치 적 안정성 인 또 다른 문제가 고려되어야한다. SVD는 ChD보다 거의 단일 공분산 행렬에 대해 수치 적으로 훨씬 안정적입니다.

참고:

  • Straka, O .; Dunik, J .; Simandl, M. & Havlik, J. "무향 칼만 필터에서의 매트릭스 분해의 측면과 비교", American Control Conference (ACC), 2013, 2013, 3075-3080.

6

다음은 두 방법의 계산 시간을 비교하기 위해 R을 사용하는 간단한 그림입니다.

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 

Hope this helps.


3

Here's the manual, or poor-man's, prove-it-to-myself demonstration:

> 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)   

Corr=[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 METHOD:

[U[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. CHOLESKY METHOD:

[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 

Thank you to @userr11852 for pointing out to me that there is a better way to calculate the difference in performance between SVD and Cholesky, in favor of the latter, using the function microbenchmark. At his suggestion, here is the result:

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 Thank you. I read cursorily the entry on microbenchmark and it really makes a difference.
Antoni Parellada

Sure, but does it have a difference in estimation performance?
Damien

Good point. I haven't had time to explore the package.
Antoni Parellada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.