¿Existe un algoritmo SVD truncado que calcula los valores singulares uno a la vez?
Mi problema: me gustaría calcular los primeros valores singulares (y vectores singulares) de una gran matriz densa , pero no sé cuál sería un valor apropiado de . es grande, por lo que por razones de eficiencia, preferiría no evaluar la SVD completa solo para truncar las SV más pequeñas después.
Idealmente, habría una manera de calcular los valores singulares serie, de mayor ( ) a menor ( ). De esa manera, podría simplemente detener el cálculo después de calcular el ésimo valor singular si cae por debajo de cierto umbral.
¿Existe tal algoritmo (preferiblemente con una implementación de Python)? En mi búsqueda en Google, solo he encontrado funciones SVD truncadas que toman k como parámetro, lo que te obliga a adivinar a priori.
fuente
Respuestas:
Hay un par de opciones disponibles si desea una factorización aproximada de rango k.
Una factorización aproximada de la forma anterior se puede convertir en una descomposición estándar como QR o SVD utilizando técnicas estándar. Halko, Martinsson y Tropp pueden encontrar una buena revisión en el documento "Encontrar estructura con aleatoriedad: algoritmos probabilísticos para construir descomposiciones de matriz aproximadas"
En términos de software, una interfaz para algoritmos de ID está disponible en scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html que le permite al usuario especificar .ϵ
fuente
(Editado, porque al principio leí mal la pregunta; ya sabes que hay rutinas disponibles para calcular los primeros valores singulares).k
Si excluye el enfoque de calcular toda la SVD, los algoritmos parciales de SVD se reducen al uso de métodos iterativos para resolver un problema relacionado con el valor propio de Hermit. Por lo tanto, una estrategia que podría tomar sería codificar manualmente este tipo de cosas usted mismo y seguir resolviendo el valor singular sin resolver más grande hasta que quiera detenerse, usando algo como una estrategia de cambio e inversión. Puede haber formas elegantes de hacer este tipo de cosas en paquetes sofisticados como SLEPc .
Otra estrategia sería la siguiente:
Si la escasa rutina SVD calcula una SVD delgada (y no puedo ver por qué no lo haría), entonces esta estrategia le brinda todos los valores singulares que desea (más posiblemente algunos adicionales), porque los valores por debajo de la tolerancia absoluta ser tratado como cero. En ese caso, puede usar scipy.sparse.linalg.svds , observando que es un parámetro opcional y que no tiene que especificarlo a priori .k
fuente