SVD para encontrar el valor propio más grande de una matriz 50x50: ¿estoy perdiendo cantidades significativas de tiempo?

13

Tengo un programa que calcula el mayor valor propio de muchas matrices simétricas reales de 50x50 realizando descomposiciones de valor singular en todas ellas. El SVD es un cuello de botella en el programa.

¿Existen algoritmos que son mucho más rápidos para encontrar el valor propio más grande, o la optimización de esta parte no daría mucho retorno de la inversión?

Anna
fuente
¿Podría dar más información sobre sus matrices, por ejemplo, si se sabe algo sobre su estructura, el rango de sus valores propios o su similitud entre sí?
Pedro
Es una matriz de covarianza ( ). Las pruebas muestran que todos menos los 5 valores propios más grandes están cerca de cero, y que el valor propio más grande es al menos ~ 20% más grande que el segundo más grande. Como hay muchos valores propios cercanos a cero, ¿supongo que el rango no es importante? Se puede reescalar a cualquier rango. La escala que estoy usando actualmente me da un rango de 150 ~ 200. XXT
Anna
Además, la matriz no es muy singular, por lo que el problema SVD está bien condicionado.
Anna
Dado que es simétrico y positivo (semi) definido, puede usar la factorización de Cholesky en lugar de la SVD. La factorización de Cholesky requiere muchos menos fracasos para computar que la SVD, pero al ser un método exacto todavía se requieren O ( n 3 ) fracasos. XXTO(n3)
Ken
@ Anna: ¿Has probado alguno de los muchos enfoques propuestos aquí? Sería bastante curioso saber qué funcionó mejor en la práctica para ti ...
Pedro

Respuestas:

12

Dependiendo de la precisión que necesite para el valor propio más grande, puede intentar usar la iteración de potencia .

Para su ejemplo específico, iría tan lejos como para no formar explícitamente, pero calcularía x X ( X T x ) en cada iteración. Calcular A requeriría operaciones O ( n 3 ) mientras que el producto matriz-vector requiere solo O ( n 2 ) .A=XXTxX(XTx)AO(n3)O(n2)

La tasa de convergencia depende de la separación entre los dos valores propios más grandes, por lo que puede no ser una buena solución en todos los casos,

Pedro
fuente
1
Si el valor propio más grande es 20% más grande que el siguiente, la iteración de potencia debería converger bastante rápido (todos los demás valores propios se amortiguan por un factor de 5/6 en cada iteración, por lo que obtienes un dígito por cada 13 iteraciones.
Wolfgang Bangerth
2
Los métodos del subespacio de Krylov son estrictamente mejores que los métodos de potencia, ya que contienen el vector de la iteración de potencia con el mismo número de iteraciones.
Jack Poulson
1
@JackPoulson: Sí, pero cada iteración es más costosa de calcular ... ¿Realmente valdría la pena por un problema tan pequeño?
Pedro
@Pedro: por supuesto, los matvecs requieren un trabajo cuadrático y el coeficiente Rayleigh eigensolve y la expansión posterior son triviales en comparación.
Jack Poulson
1
Gasto de código? Como @JackPoulson abordó el tema, B. Parlett et al (1982) ("Sobre la estimación del valor propio más grande con el algoritmo de Lanczos") comparan el método de potencia, el método de potencia + aceleración de Aitken y una aplicación de Lanczos dirigida al mayor valor propio de un real simétrica (o hermitiana) pos. def. matriz. Concluyen que el método de Lanczos es más eficiente si se necesita incluso una precisión modesta (del primer valor propio en relación con el segundo), y mejor para evitar la convergencia errónea.
hardmath
5

Si solo 5 valores propios son muy significativos, el algoritmo de Lanczsos con como multiplicación matriz-vector debería dar una convergencia lineal rápida después de 5 pasos iniciales, por lo tanto, un valor propio más grande bastante preciso con pocas iteraciones.X(XTx)

Arnold Neumaier
fuente
¿Estás (@ArnoldNeumaier) pensando en algo como esto , adecuadamente simplificado ( )? Es interesante que proporcione una aproximación diferente de Lanczos si se retiene un tercer vector, sobre el mismo subespacio de Krylov. B=T=I
hardmath
No; Me refería al algoritmo estándar de Lanczsos, pero tenía prisa escrito CG. Ahora corregido.
Arnold Neumaier
4

Para una matriz semi-definida positiva como , puede valer la pena acelerar la convergencia con un cambio de espectro . Es decir, un escalar adecuada μ se elige y el método se aplica energía a A - μ I en lugar de una .A=XXTμAμIA

Unas pocas iteraciones del método de potencia básico deberían darle una estimación aproximada del mayor valor propio λ 1 . Suponiendo que el valor propio dominante tiene multiplicidad 1 y que todos los demás están en [ 0 , 5||Ax||/||x||λ1, luegoA-5[0,56λ1]gustaría tener un valor propio más grande7A512λ1Iy el resto en[-5712λ1.[512λ1,512λ1]

En otras palabras, aumentaría el dominio del valor propio más grande del 20% sobre el siguiente valor más grande al 40% sobre el siguiente valor propio más grande (valor absoluto de un). La convergencia geométrica del método de potencia se aceleraría en consecuencia. Una vez que se encuentra el valor propio más grande de con suficiente precisión, se estima λ 1 agregando de nuevo el desplazamiento μ que se había eliminado.AμIλ1μ

Tenga en cuenta que no es necesario que forme explícitamente porque ( A - μ I ) x = X ( X T x ) - μ x aún puede calcularse con un esfuerzo O ( n 2 ) .AμI(AμI)x=X(XTx)μxO(n2)

hardmath
fuente
Esto parecería requerir tener una buena idea de cuál es la magnitud del segundo valor propio más grande. ¿Cómo lo aproximarías en tal caso?
Pedro
λ1|λ2|/|λ1||λ2|/|λ1|, and hence the size of λ2 relative to λ1 if desired. I was suggesting what benefit you'd see in a case such as Anna describes in her comments below the Question.
hardmath