Un problema común en estadística es calcular la inversa de la raíz cuadrada de una matriz simétrica positiva definida. ¿Cuál sería la forma más eficiente de calcular esto?
Encontré algo de literatura (que aún no he leído) y algún código R incidental aquí , que reproduciré aquí por conveniencia
# function to compute the inverse square root of a matrix
fnMatSqrtInverse = function(mA) {
ei = eigen(mA)
d = ei$values
d = (d+abs(d))/2
d2 = 1/sqrt(d)
d2[d == 0] = 0
return(ei$vectors %*% diag(d2) %*% t(ei$vectors))
}
No estoy completamente seguro de entender la línea d = (d+abs(d))/2
. ¿Existe una forma más eficiente de calcular la matriz inversa de raíz cuadrada? La eigen
función R llama LAPACK .
linear-algebra
numerical-analysis
matrix
tchakravarty
fuente
fuente
d[d<0] = 0
, que es más expresiva.Respuestas:
El código que ha publicado utiliza la descomposición del valor propio de la matriz simétrica para calcular .UN- 1 / 2
La declaración
d = (d + abs (d)) / 2
efectivamente toma cualquier entrada negativa en d y la establece en 0, mientras deja solo las entradas no negativas. Es decir, cualquier valor propio negativo de se trata como si fuera 0. En teoría, todos los valores propios de A no deberían ser negativos, pero en la práctica es común ver pequeños valores propios negativos cuando calcula los valores propios de un supuesto supuestamente positivo. matriz de covarianza que es casi singular.UN
Si realmente necesita la inversa de la raíz cuadrada de la matriz simétrica de , y es razonablemente pequeña (no más grande que decir 1,000 por 1,000), entonces esto es tan bueno como cualquier método que pueda usar.UN UN
En muchos casos, puede utilizar un factor de Cholesky de la inversa de la matriz de covarianza (o prácticamente el mismo, el factor de Cholesky de la matriz de covarianza en sí). Calcular el factor de Cholesky suele ser un orden de magnitud más rápido que calcular la descomposición del valor propio para matrices densas y mucho más eficientes (tanto en tiempo de cómputo como en almacenamiento requerido) para matrices grandes y dispersas. Por lo tanto, usar la factorización de Cholesky se vuelve muy deseable cuando es grande y escaso.UN
fuente
En mi experiencia, el método de Newton polar de Higham funciona mucho más rápido (ver Capítulo 6 de Funciones de matrices de N. Higham). En esta breve nota mía hay tramas que comparan este método con los métodos de primer orden. Además, se presentan citas de varios otros enfoques de matriz-raíz cuadrada, aunque la iteración de Newton polar parece funcionar mejor (y evita hacer cálculos de vectores propios).
fuente
Optimiza tu código:
Opción 1: optimice su código R:
a. Puede
apply()
una función parad
que a la vezmax(d,0)
yd2[d==0]=0
en un solo bucle.si. Intente operar
ei$values
directamente.Opción 2: usar C ++:
reescribe toda la función en C ++ con
RcppArmadillo
. Aún podrá llamarlo desde R.fuente