Cholesky contro eigendecomposition per estrarre campioni da una distribuzione normale multivariata


16

Vorrei disegnare un campione xN(0,Σ) . Wikipedia suggerisce di usare una composizione Cholesky o Eigendec , cioè Σ=D1D1T o Σ=QΛQT

E quindi il campione può essere disegnato tramite: x=D1v oppure x=QΛv dove vN(0,I)

Wikipedia suggerisce che sono entrambi ugualmente buoni per generare campioni, ma il metodo Cholesky ha il tempo di calcolo più veloce. È vero? Soprattutto numericamente quando si utilizza un metodo monte-carlo, dove le varianze lungo le diagonali possono differire di diversi ordini di grandezza? Esiste un'analisi formale su questo problema?


1
Damien, la migliore ricetta per assicurarsi quale programma sia più veloce è controllarlo tu stesso sul tuo software: le funzioni di decomposizione di Cholesky e di Eigent possono variare in velocità in diverse implementazioni. Il modo Cholesky è più popolare, AFAIK, ma il modo Eigen potrebbe essere potenzialmente più flessibile.
ttnphns,

1
Capisco Cholesky per essere più veloce ( Wikipedia ), mentre eigendecomposition è O ( N 3 ) ( Jacobi Autovalore Algorithm Tuttavia, ho due ulteriori problemi:.? (1) Che cosa significa "potenzialmente più flessibile" media e (2) Le variazioni differiscono per diversi ordini di grandezza ( 10 - 4O(N3/3)O(N3)104 contro per gli elementi più estremi) - questo ha un rapporto con l'algoritmo selezionato?109
Damien,

@Damien un aspetto di "più flessibile" è che la composizione elettronica, che per una matrice di covarianza corrisponde all'SVD , può essere troncata per ottenere un'approssimazione di basso rango ottimale dell'intera matrice. L'SVD troncato può essere calcolato direttamente, piuttosto che calcolare l'intera cosa e quindi eliminare i piccoli autovalori.
GeoMatt22,

Che ne dici di leggere la mia risposta su Stack Overflow: Ottieni vertici dell'ellisse su un diagramma di covarianza ellittica (creato da car::ellipse) . Sebbene la domanda venga posta in diverse applicazioni, la teoria alla base è la stessa. Lì vedrai belle figure per una spiegazione geometrica.
李哲源

Risposte:


12

Il problema è stato studiato da Straka et.al per Unscented Kalman Filter che preleva campioni (deterministici) da una distribuzione normale multivariata come parte dell'algoritmo. Con un po 'di fortuna, i risultati potrebbero essere applicabili al problema monte-carlo.

La Cholesky Decomposition (CD) e la Eigen Decomposition (ED) - e del resto l'attuale Matrix Square Root (MSR) sono tutti modi in cui una matrice semi-definita positiva (PSD) può essere scomposta.

Si consideri la SVD di una matrice PSD, . Poiché P è PSD, questo è in realtà lo stesso del ED con P = U S U T . Inoltre, possiamo dividere la matrice diagonale per la sua radice quadrata: P = U P=USVTP=USUT, osservando cheP=USSTUT.S=ST

Ora possiamo introdurre una matrice ortogonale arbitraria :O

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

La scelta di influisce effettivamente sulle prestazioni di stima, soprattutto quando sono presenti elementi off-diagonali forti della matrice di covarianza.O

L'articolo ha studiato tre scelte di :O

  • , che corrisponde all'ED;O=I
  • O=Q dalla decomposizione QR di , che corrisponde al CD; eUS=QR
  • che porta a una matrice simmetrica (cioè MSR)O=UT

Da cui sono state tratte le seguenti conclusioni nel documento dopo molte analisi (citando):

  • Per una variabile casuale da trasformare con elementi non correlati tutti e tre i MD considerati forniscono punti sigma identici e quindi non fanno quasi alcuna differenza sulla qualità dell'approssimazione [Trasformazione non profumata]. In tal caso, il CD può essere preferito per i suoi bassi costi.

  • Se la variabile casuale contiene elementi correlati, l'uso di diverse [decomposizioni] può influire in modo significativo sulla qualità dell'approssimazione [Trasformazione non profumata] della matrice media o di covarianza della variabile casuale trasformata. I due casi precedenti hanno mostrato che si dovrebbe preferire [ED].

  • Se gli elementi della variabile da trasformare mostrano una forte correlazione in modo che la matrice di covarianza corrispondente sia quasi singolare, si deve tener conto di un'altra questione, ovvero la stabilità numerica dell'algoritmo che calcola il MD. La SVD è molto più numericamente stabile per le matrici di covarianza quasi singolari rispetto alla ChD.

Riferimento:

  • Straka, O .; Dunik, J .; Simandl, M. & Havlik, J. "Aspetti e confronto delle decomposizioni matriciali nel filtro Kalman senza profumo", American Control Conference (ACC), 2013, 2013, 3075-3080.

6

Ecco una semplice illustrazione che utilizza R per confrontare il tempo di calcolo dei due metodi.

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

I tempi di esecuzione sono

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

Quando si aumenta la dimensione del campione a 10000, i tempi di esecuzione sono

> 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 

Spero che sia di aiuto.


3

Ecco la dimostrazione manuale, o povero, della dimostrazione:

> 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.