Processing math: 100%

11 votos

Cálculo de la traza del producto de dos matrices

Tengo que calcular trace(A1B) donde A es una matriz simétrica positiva definida y B es una matriz simétrica, muy dispersa con sólo dos elementos no nulos. Quiero encontrar una manera de calcular la expresión anterior de manera eficiente, especialmente cuando A y B son de alta dimensión como 10000×10000. ¿Cuál es la mejor manera de hacerlo?

Tengo un puñado de B, cada una muy dispersa, con sólo dos valores no nulos. No puedo almacenar A1 ya que es denso y no tendré suficiente memoria. Alguna forma o truco eficiente para hacerlo de forma eficiente, como propiedades de rastreo o algo así?

0 votos

Empieza por descomponer A=LL utilizando una descomposición Cholesky con L una matriz diagonal inferior, y B=eiej con ei un vector unitario con un 1 en el i -y cero en el resto.

0 votos

Cuando dice "un montón de B", ¿de cuántas estamos hablando? Va a ser difícil encontrar una solución que no requiera O(n2) almacenamiento; ciertamente, ni la solución ofrecida a continuación ni la de los comentarios lo evitan.

0 votos

¿Cómo es A ¿se almacena actualmente? En doble precisión requiere 80GiB de memoria (40GiB si se utiliza un formato empaquetado que aprovecha la simetría). ¿Tiene realmente la versión completa de A ¿se almacena en algún lugar, o se determina algorítmicamente?

9voto

Giulio Muscarello Puntos 150

En primer lugar, permítanme ofrecer una derivación puramente matemática, y luego intentaremos abordar el problema del almacenamiento una vez que obtenga respuestas a las preguntas que planteé en los comentarios anteriores. Editaré esta respuesta según sea necesario.

Desde A es simétrica y definida positiva, admite una factorización Cholesky A=LLT , donde L es triangular inferior; y A=LTL1 . Definamos M=L1 que también es una matriz triangular inferior, por lo que A1=MTM ; y dejar que mk denotan el k columna de M .

Además, usted dice que B es simétrica con dos elementos no nulos. Esto significa que B puede adoptar una de estas dos formas: B=α(eieTj+ejeTi)orB=αeieTi+βejeTj donde ek es un vector con un uno en el k y ceros en el resto. Consideremos por un momento la primera forma: Tr(A1B)=αTr(A1(eieTj+ejeTi))=αTr(A1eieTj)+αTr(A1ejeTi)=αeTjA1ei+αeTiA1ej=2α[A1]ij=2αeTjMTMei=2αmi,mj Así que, como puede ver, el trazado requiere exactamente un elemento de A1 , o el producto interior de dos columnas de M . Una derivación similar para el segundo caso da como resultado Tr(A1B)=α[A1]ii+β[A1]jj+αmi,mi+βmj,mj

Así que espero que ahora quede claro por qué he preguntado: ¿cuántos B ¿hay matrices? ¿Cómo es A ¿Guardado? ¿Qué tipo de operaciones podemos realizar con A ? Estas preguntas son esenciales para determinar qué hacer en este caso. Por ejemplo, si sólo hay un puñado de índices únicos i,j anterior, entonces un enfoque es calcular cada fiA1ei utilizando algún tipo de método iterativo, y luego utilizar eTjA1eI=eTjfi .

Pero si la mayoría de los índices i=1,2,,10000 se representan, puede ser más conveniente hacer algún tipo de factorización Cholesky en la matriz. Sí, puede que no tengas suficiente memoria para hacer una en el núcleo factorización. Pero las factorizaciones Cholesky se pueden hacer fuera del núcleo . Esto implica realizar los cálculos en bloques, leer en memoria sólo los datos suficientes para resolver ese bloque concreto y escribir cada bloque en el disco antes de proceder al siguiente.

1 votos

Buen enfoque. No almacenaría fi para todos i ser tan costoso como almacenar A1 ¿en sí mismo?

0 votos

Sí, es cierto. En un extremo, se computan todos los fi vectores a la vez; esto minimiza el cómputo pero a costa de la memoria. En el otro extremo, sólo se guardan 2 a la vez en la memoria, pero hay que hacer muchos recálculos. Un punto intermedio podría ser la opción más práctica.

0 votos

Eso tiene mucho sentido.

3voto

Daniel Mahler Puntos 994

Si realmente sólo hay 2 valores no nulos en B entonces se puede calcular tr(A1B) de A y 2 de su menores . Una matriz de 2 elementos es la suma de 2 matrices de 1 elemento y una matriz de 1 elemento es el producto exterior de vectores de 1 elemento, utilizando bra-ket notación: B=X+Y=|r1xc1|+|r2yc2| Dado que la traza es un operador lineal tr(A1B)=tr(A1(X+Y))=tr(A1X)+tr(A1Y) Dejemos que C sea el matriz de cofactores de A tr(A1X)=tr(A1|r1xc1|)=xc1|A1|r1=x(A1)c1r1=x(CdetA)c1r1=xCr1c1detAtr(A1B)=xCr1c1+yCr2c2detA Esto ahorra tener que invertir A . Sólo el determinante y 2 cofactores específicos de A deben ser calculados, por lo que tr(A1B) puede calcularse con un pequeño factor constante del coste de detA .

En los últimos años se ha avanzado en los algoritmos prácticos para los determinantes de grandes matrices dispersas. Esta no es mi área de experiencia, pero aquí hay algunas referencias:

  • Erlend Aune, Daniel P. Simpson: Estimación de parámetros en distribuciones gaussianas de alta dimensión En particular, la sección 2.1 ( arxiv:1105.5256 ) (versión más larga publicada versión )
  • Ilse C.F. Ipsen, Dean J. Lee: Aproximaciones de determinantes ( arxiv:1105.0437 )
  • Arnold Reusken: Aproximación del determinante de grandes matrices simétricas positivas definidas dispersas ( arxiv:hep-lat/0008007 )
  • notas para una implementación en la biblioteca shogun

Estos métodos parecen ser principalmente métodos de aproximación que pueden calcular el determinante con una precisión arbitraria a costa de aumentar el tiempo de ejecución, así que puedes elegir el equilibrio entre velocidad y precisión. También parecen evitar la materialización de grandes matrices densas en los cálculos intermedios

0 votos

¿Cómo se propone calcular el determinante sin O(n2) ¿almacenamiento?

2 votos

He adjuntado algunas referencias a la respuesta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X