Determinar rápidamente si una matriz densa es o no de rango bajo

13

En un proyecto de software en el que estoy trabajando, ciertos cálculos son mucho más fáciles para matrices densas de bajo rango. Algunas instancias de problemas involucran matrices densas de bajo rango, pero me las dan en su totalidad, en lugar de como factores, por lo que tendré que verificar el rango y factorizar la matriz si quiero aprovechar la estructura de bajo rango. .

Las matrices en cuestión son típicamente completamente o casi completamente densas, con n que van desde cien hasta unos pocos miles. Si una matriz tiene un rango bajo (digamos menos de 5 a 10), entonces vale la pena calcular la SVD y usarla para formar una factorización de bajo rango. Sin embargo, si la matriz no es de bajo rango, entonces el esfuerzo se desperdiciaría.

Por lo tanto, me gustaría encontrar una forma rápida y razonablemente confiable de determinar si el rango es bajo o no antes de invertir el esfuerzo para hacer una factorización SVD completa. Si en algún momento queda claro que el rango está por encima del límite, el proceso puede detenerse de inmediato. Si el procedimiento declara por error que la matriz es de rango bajo cuando no lo es, esto no es un gran problema, ya que todavía estaría haciendo una SVD completa para confirmar el rango bajo y encontrar una factorización de rango bajo.

Las opciones que he considerado incluyen un rango que revela la factorización LU o QR seguido de una SVD completa como verificación. ¿Hay otros enfoques que debería considerar?

Brian Borchers
fuente

Respuestas:

8

Hay un buen truco que aprendí recientemente de este artículo . Empiezas a hacer QR que revela rangos, y te detienes después de las primeras reflexiones del familia, cuando tienes una matriz de la forma con triangular de tamaño , y típicamente no triangular (ya que nos detuvimos después de las primeras iteraciones de nuestro bucle principal). En este punto, verifica si : si se mantiene, entonces está a una distancia máxima de de una matriz de rango[ R 1 R 12 0 R 22 ] , R 1 k × k R 22 k R 22ε A ε kk

[R1R120R22],
R1k×kR22kR22εAεk; de lo contrario no debería ser (salvo errores numéricos).

Este procedimiento cuesta para una matriz densa .n × nO(n2k)norte×norte

Federico Poloni
fuente
Este es esencialmente el enfoque que describí en la pregunta. Creo que la respuesta propuesta de Wolfgang Bangerth podría ser mejor que . O(norte2k)
Brian Borchers
7

El problema, por supuesto, es que calcular el rango verdadero (por ejemplo, mediante una descomposición QR) no es realmente más barato que calcular una representación de bajo rango de la matriz.

Lo mejor que probablemente puede hacer es usar un algoritmo aleatorio para encontrar aproximaciones de bajo rango. Estos pueden, al menos en teoría, ser significativamente más rápidos que trabajar en toda la matriz porque, en esencia, solo calculan descomposiciones para proyecciones de la matriz en subespacios aleatorios.

Si eso vale la pena para una matriz de tamaño puede ser una buena pregunta, pero si sus problemas realmente se vuelven grandes, sospecharía que vale la pena.100×100

Wolfgang Bangerth
fuente
Por lo que sé de estos algoritmos, producen una matriz de bajo rango que es razonablemente cercana en norma a la matriz dada. Necesito saber si hay o no (por ejemplo) una matriz de rango 10 o menos que esté muy cerca de la matriz dada (digamos un error relativo de 1.0e-10 o mejor.)
Brian Borchers
Sí, pero también puede hacer una descomposición QR de la matriz proyectada (de baja dimensión) y si esa descomposición revela una falta de rango completo, entonces también tendrá una matriz original deficiente en rango. ¿No era ese el criterio que necesitabas para hacer una descomposición QR en la matriz original?
Wolfgang Bangerth
Puedo ver que el rango de la matriz proyectada es menor o igual a (el número de filas en la matriz aleatoria que multiplico por A) y el rango de A. Si es del rango , entonces la matriz original no puede ser de rango o menos. Si tiene un rango inferior a entonces podría haber tenido mala suerte o tenía un rango inferior a . Encontrar el rango de la matriz por se puede hacer en el tiempo . Sin embargo, si la matriz aleatoria que multiplico por es densa, la multiplicación tomak k - 1 k A k k n O ( k 2 n ) A O ( k n 2 )kkk-1kUNkknorteO(k2norte)UNO(knorte2)hora. ¿Hay matrices dispersas que preserven el rango con alta probabilidad?
Brian Borchers
No lo sé. Estoy de acuerdo (y quería decir) que el algoritmo solo puede decirte si una matriz no tiene rango completo. No puede decirle si la matriz es de rango completo a menos que tome todas las direcciones aleatorias . Simplemente espero que obtenga una respuesta para suficientemente pequeña donde . k k n 2n 3k=nortekknorte2norte3
Wolfgang Bangerth
1

Otro enfoque que vale la pena intentar es utilizar la aproximación cruzada adaptativa (ACA). Es un algoritmo bastante popular que tiene muchas implementaciones disponibles en línea. Para la referencia, puede ver el documento original:

ACA y sus variaciones (por ejemplo, ACA +, HCA de aproximación cruzada híbrida) se pueden usar en diferentes escenarios. Usted, que ya tiene calculada toda la matriz densa, es uno de los favorables, ya que podrá calcular los residuos exactamente si es necesario.

Si los residuos heurísticos (ver el algoritmo) son suficientes, creo que su complejidad será , dondeNO(norter)norter(ϵ)rϵO(norte2r)

Anton Menshov
fuente
0

UN0 0XUNXUNUNTUN

(UNTUN)UN

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
denis
fuente