Estoy estudiando PCA del curso Coursera de Andrew Ng y otros materiales. En el curso de Stanford NLP, la primera asignación de cs224n , y en el video de la conferencia de Andrew Ng , hacen una descomposición de valores singulares en lugar de la descomposición de vectores propios de la matriz de covarianza, y Ng incluso dice que SVD es numéricamente más estable que la descomposición propia.
Según tengo entendido, para PCA deberíamos hacer SVD de la matriz de (m,n)
tamaño de datos , no de la matriz de (n,n)
tamaño de covarianza . Y la descomposición del vector propio de la matriz de covarianza.
¿Por qué hacen SVD de matriz de covarianza, no matriz de datos?
pca
linear-algebra
svd
eigenvalues
numerics
DongukJu
fuente
fuente
x=randn(10000); x=x'*x; tic; eig(x); toc; tic; svd(x); toc;
mi máquina genera 12 s para eig () y 26 s para svd (). Si es mucho más lento, ¡al menos debe ser más estable! :-)eig
osvd
en la matriz de covarianza, pero que yo sepa no hay una gran diferencia entre usareig
osvd
en la matriz de covarianza --- son ambos algoritmos estables hacia atrás. En todo caso, pondría mi dinero en eig para que sea más estable, ya que hace menos cálculos (suponiendo que ambos se implementen con algoritmos de última generación).Respuestas:
ameba ya dio una buena respuesta en los comentarios, pero si quieres una discusión formal, aquí va.
Voilà!
Con respecto a la estabilidad numérica, uno necesitaría descubrir cuáles son los algoritmos empleados. Si estás preparado, creo que estas son las rutinas LAPACK utilizadas por numpy:
Actualización: en cuanto a la estabilidad, la implementación de SVD parece estar utilizando un enfoque de divide y vencerás, mientras que la descomposición propia usa un algoritmo QR simple. No puedo acceder a algunos documentos relevantes de SIAM de mi institución (culpar a los recortes de investigación) pero encontré algo que podría apoyar la evaluación de que la rutina SVD es más estable.
En
comparan la estabilidad de varios algoritmos de valores propios, y parece que el enfoque de dividir y conquistar (¡usan el mismo como numpy en uno de los experimentos!) es más estable que el algoritmo QR. Esto, junto con las afirmaciones de que los métodos de D&C son más estables, respalda la elección de Ng.
fuente
@amoeba tenía excelentes respuestas a las preguntas de PCA, incluida esta en relación con SVD a PCA. Respondiendo a su pregunta exacta, haré tres puntos:
Resulta que SVD es más estable que los procedimientos típicos de descomposición de valores propios, especialmente para el aprendizaje automático. En el aprendizaje automático, es fácil terminar con regresores altamente colineales. SVD funciona mejor en estos casos.
Aquí está el código de Python para demostrar el punto. Creé una matriz de datos altamente colineal, obtuve su matriz de covarianza y traté de obtener los valores propios de esta última. SVD todavía funciona, mientras que la descomposición del eigen ordinario falla en este caso.
Salida:
Actualizar
En respuesta al comentario de Federico Poloni, aquí está el código con pruebas de estabilidad de SVD vs Eig en 1000 muestras aleatorias de la misma matriz anterior. En muchos casos, Eig muestra 0 valor propio pequeño, lo que llevaría a la singularidad de la matriz, y SVD no lo hace aquí. La SVD es aproximadamente dos veces más precisa en una determinación de valor de eigen pequeño, que puede o no ser importante dependiendo de su problema.
Salida:
fuente
Para los usuarios de Python, me gustaría señalar que para las matrices simétricas (como la matriz de covarianza), es mejor usar la
numpy.linalg.eigh
función en lugar de unanumpy.linalg.eig
función general .eigh
es 9-10 veces más rápido queeig
en mi computadora (independientemente del tamaño de la matriz) y tiene una mejor precisión (según la prueba de precisión de @ Aksakal).No estoy convencido con la demostración del beneficio de precisión de SVD con valores propios pequeños. La prueba de @ Aksakal es 1-2 órdenes de magnitud más sensibles al estado aleatorio que al algoritmo (intente trazar todos los errores en lugar de reducirlos a un máximo absoluto). Significa que pequeños errores en la matriz de covarianza tendrán un mayor efecto sobre la precisión que la elección de un algoritmo de descomposición propia. Además, esto no está relacionado con la pregunta principal, que es sobre PCA. Los componentes más pequeños se ignoran en PCA.
Se puede hacer un argumento similar sobre la estabilidad numérica. Si tengo que usar el método de matriz de covarianza para PCA, lo descompondría con en
eigh
lugar desvd
. Si falla (que aún no se ha demostrado aquí), entonces probablemente valga la pena repensar el problema que está tratando de resolver antes de comenzar a buscar un algoritmo mejor.fuente
eigh
vseig
: mail.scipy.org/pipermail/numpy-discussion/2006-March/…Calcular la matriz de covarianza y luego realizar SVD en eso es mucho más rápido que calcular SVD en la matriz de datos completa en estas condiciones, para el mismo resultado.
Incluso para valores bastante pequeños, las ganancias de rendimiento son factores de miles (milisegundos frente a segundos). Realicé algunas pruebas en mi máquina para comparar usando Matlab:
Eso es solo tiempo de CPU, pero las necesidades de almacenamiento son tan importantes, si no más. Si intenta SVD en una matriz de un millón por mil en Matlab, se producirá un error de forma predeterminada, ya que necesita un tamaño de matriz de trabajo de 7,4 TB.
fuente