Tengo una matriz cuadrada simétrica real densa. La dimensión es de aproximadamente 1000x1000. Necesito calcular el primer componente principal y preguntarme cuál sería el mejor algoritmo para hacerlo.
Parece que MATLAB usa los algoritmos Arnoldi / Lanczos (para eigs
). Pero al leer sobre ellos, no estoy seguro de si tienen alguna ventaja sobre la iteración de potencia simple , ya que mi matriz no es escasa y solo estoy interesado en el primer vector propio.
¿Alguna recomendación de cuál es el algoritmo más rápido en este caso?
linear-algebra
algorithms
eigensystem
Mika Fischer
fuente
fuente
Respuestas:
El método más rápido probablemente dependerá del espectro y la normalidad de su matriz, pero en todos los casos los algoritmos de Krylov deberían ser estrictamente mejores que la iteración de potencia. GW Stewart tiene una buena discusión sobre este tema en el Capítulo 4, Sección 3 de Algoritmos de matriz, Volumen II: Eigensystems :
fuente
La iteración de potencia es la más simple, pero como se mencionó anteriormente, probablemente convergería muy lentamente si la matriz es muy no normal. Obtiene un fenómeno de "joroba" donde la secuencia parece divergir durante muchas iteraciones antes de que comience el comportamiento asintótico.
Dado que su matriz es simétrica, podría considerar las iteraciones RQI, que en el caso simétrico producen convergencia cúbica: http://en.wikipedia.org/wiki/Rayleigh_quotient_iteration .
Lo que hace que las iteraciones de Arnoldi o Lanczos sean muy agradables (al menos en mi opinión, pero no investigo el álgebra lineal numérica) es que son muy versátiles. Por lo general, es posible controlar qué valores propios te dan y cuántos obtienes. Esto es especialmente cierto en el caso simétrico (y aún mejor si su matriz es definitiva). Para problemas simétricos son muy robustos. Como caja negra funcionan bien, pero también son muy receptivos a la información de nuevos problemas, como la capacidad de resolver sistemas que involucran la matriz.
fuente