Cholesky versus descomposición propia para extraer muestras de una distribución normal multivariante

16

Me gustaría dibujar una muestra xN(0,Σ) . Wikipedia sugiere usar una descomposición de Cholesky o Eigen , es decir, Σ=D1D1T o Σ=QΛQT

Y por lo tanto, la muestra se puede extraer mediante: x=D1v o x=QΛv donde vN(0,I)

Wikipedia sugiere que ambos son igualmente buenos para generar muestras, pero el método Cholesky tiene el tiempo de cálculo más rápido. ¿Es esto cierto? ¿Especialmente numéricamente cuando se usa un método monte-carlo, donde las variaciones a lo largo de las diagonales pueden diferir en varios órdenes de magnitud? ¿Hay algún análisis formal sobre este problema?

Damien
fuente
1
Damien, la mejor receta para asegurarte de que el programa es más rápido es comprobarlo tú mismo en tu software: las funciones de descomposición de Cholesky y Eigen pueden variar en velocidad en diferentes implementaciones. La forma Cholesky es más popular, AFAIK, pero la forma propia puede ser potencialmente más flexible.
ttnphns
1
Entiendo Cholesky para ser más rápido ( Wikipedia ) mientras que eigendecomposition es O ( N 3 ) ( Jacobi valor propio algoritmo Sin embargo, tengo dos problemas adicionales:.? (1) ¿Qué significa "potencialmente más flexible" media y (2) Las variaciones difieren en varios órdenes de magnitud ( 10 - 4 vs 10 - 9 para los elementos más extremos) - ¿Esto tiene relación con el algoritmo seleccionado?O(N3/3)O(N3)104109
Damien
@Damien un aspecto de "más flexible" es que la descomposición propia, que para una matriz de covarianza corresponde a la SVD , puede truncarse para obtener una aproximación óptima de bajo rango de la matriz completa. El SVD truncado se puede calcular directamente, en lugar de calcular todo y luego arrojar los pequeños valores propios.
GeoMatt22
¿Qué tal leer mi respuesta en Stack Overflow: Obtener vértices de la elipse en un gráfico de covarianza de elipse (creado por car::ellipse) . Aunque la pregunta se hace en diferentes aplicaciones, la teoría detrás es la misma. Verá bonitas figuras para la explicación geométrica allí.
李哲源

Respuestas:

12

El problema fue estudiado por Straka et.al para el filtro de Kalman sin perfume que extrae muestras (deterministas) de una distribución normal multivariante como parte del algoritmo. Con un poco de suerte, los resultados podrían ser aplicables al problema de Monte Carlo.

La descomposición de Cholesky (CD) y la descomposición de Eigen (ED), y de hecho la raíz cuadrada de matriz (MSR) real , son todas formas en que se puede descomponer una matriz semi-definida positiva (PSD).

Considere la SVD de una matriz de PSD, . Puesto que P es PSD, esto es en realidad el mismo que el ED con P = U S T T . Además, podemos dividir la matriz diagonal por su raíz cuadrada: P = U P=USVTP=USUT, señalando quePAG=USSTUT.S=ST

Ahora podemos introducir una matriz ortogonal arbitraria :O

PAG=USOOTSTUT=(USO)(USO)T .

La elección de O realidad afecta el rendimiento de la estimación, especialmente cuando hay elementos fuertes fuera de la diagonal de la matriz de covarianza.

El artículo estudió tres opciones de :O

  • O=yo , que corresponde a la DE;
  • de ladescomposición QRde UO=QUS=QR , que corresponde al CD; y
  • O=UT que conduce a una matriz simétrica (es decir, MSR)

De las cuales se extrajeron las siguientes conclusiones en el documento después de mucho análisis (cita):

  • Para una variable aleatoria que se va a transformar con elementos no correlacionados, los tres MD considerados proporcionan puntos sigma idénticos y, por lo tanto, casi no hacen diferencia en la calidad de la aproximación [Transformación sin perfume]. En tal caso, el CD puede ser preferido por sus bajos costos.

  • Si la variable aleatoria contiene elementos correlacionados, el uso de diferentes [descomposiciones] puede afectar significativamente la calidad de la aproximación [Transformación sin perfume] de la matriz media o de covarianza de la variable aleatoria transformada. Los dos casos anteriores mostraron que se debería preferir la [DE].

  • Si los elementos de la variable a ser transformada exhiben una fuerte correlación, de modo que la matriz de covarianza correspondiente es casi singular, debe tenerse en cuenta otra cuestión, que es la estabilidad numérica del algoritmo que computa el MD. La SVD es mucho más estable numéricamente para matrices de covarianza casi singulares que la ChD.

Referencia:

  • Straka, O .; Dunik, J .; Simandl, M. y Havlik, J. "Aspectos y comparación de las descomposiciones de matriz en el filtro de Kalman sin perfume", American Control Conference (ACC), 2013, 2013, 3075-3080.
Damien
fuente
6

Aquí hay una ilustración simple que usa R para comparar el tiempo de cálculo de los dos métodos.

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

Los tiempos de ejecución son

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

Al aumentar el tamaño de la muestra a 10000, los tiempos de ejecución son

> 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 

Espero que esto ayude.

Aaron Zeng
fuente
3

Aquí está el manual, o la demostración de prueba de mí mismo del pobre:

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

norte=[[,1][,2][,3][1,]-1.08063380.65639130.8400443[2,]-1.1434241-0.1729738-0.9884772[999999,]0.48618270.03563006-2.1176976[1000000,]-0.43945511.69265517-1.9534729]

1. MÉTODO SVD:

[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
Antoni Parellada
fuente
@ user11852 Gracias. Leí con cursor la entrada microbenchmarky realmente hace la diferencia.
Antoni Parellada
Claro, pero ¿tiene alguna diferencia en el rendimiento de la estimación?
Damien
Buen punto. No he tenido tiempo de explorar el paquete.
Antoni Parellada