Estoy estudiando PCA a partir del curso Coursera de Andrew Ng y otros materiales. En el curso de PNL de Stanford cs224n's primer encargo y en el Vídeo de la conferencia de Andrew Ng En el caso de las matrices de covarianza, se realiza la descomposición del valor singular en lugar de la descomposición de los vectores propios, y Ng incluso dice que la SVD es numéricamente más estable que la descomposición de los vectores propios.
Según tengo entendido, para el ACP debemos hacer la SVD de la matriz de datos de (m,n)
tamaño, no de la matriz de covarianza de (n,n)
tamaño. Y la descomposición de los vectores propios de la matriz de covarianza.
¿Por qué hacen la SVD de la matriz de covarianza y no de la matriz de datos?
14 votos
Para las matrices semidefinidas positivas simétricas cuadradas (como la matriz de covarianza), las descomposiciones de valores propios y de valores singulares son exactamente las mismas.
9 votos
Quiero decir que son matemáticamente lo mismo. Numéricamente efectivamente podrían utilizar algoritmos diferentes y uno podría ser más estable que otro (como dice Ng). Sería interesante saber más sobre esto, +1.
5 votos
Aquí encontrará información al respecto: de.mathworks.com/matlabcentral/newsreader/view_thread/21268 . Pero ten en cuenta que cualquier explicación sobre por qué un algoritmo sería más estable que otro va a ser muy técnica.
2 votos
En Matlab
x=randn(10000); x=x'*x; tic; eig(x); toc; tic; svd(x); toc;
en mi máquina produce 12s para eig() y 26s para svd(). Si es mucho más lento, ¡al menos debe ser más estable! :-)5 votos
Eso podría estar basado en una comprensión incorrecta: hacer una SVD de la matriz de datos es más estable que el uso de
eig
osvd
en la matriz de covarianza, pero hasta donde yo sé no hay gran diferencia entre usareig
osvd
en la matriz de covarianza --- ambos son algoritmos estables hacia atrás. En todo caso, yo apostaría por que eig es más estable, ya que realiza menos cálculos (suponiendo que ambos se implementen con algoritmos de última generación).1 votos
@FedericoPoloni En realidad, creo que A. Ng puede tener razón. Aparentemente, la implementación de LAPACK del SVD utiliza un enfoque de dividir y conquistar como se describe aquí: es.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm a diferencia del algoritmo QR convencional utilizado por el código de eigendecomposición. El primero parece ser más estable, aunque no he leído una explicación detallada de por qué.
0 votos
@FedericoPoloni He encontrado un documento relevante. Mira mi respuesta actualizada si te interesa.
1 votos
TL;DR La respuesta está en su pregunta: SVD es mucho más estable numéricamente que EIG
2 votos
Como mencionó @amoeba en los comentarios, la pregunta no es sobre la comparación de la SVD en los datos con la descomposición eigen en la matriz de covarianza, es sobre por qué se utilizó la SVD en la matriz de "covarianza".
0 votos
@broncoAbierto Interesante no conocía estos detalles, en particular que se utilizan dos algoritmos diferentes para estas dos tareas en Lapack actualmente.
0 votos
A veces obtengo diferentes descomposiciones. Por ejemplo
C = [ 0.236553 -0.020460 0.029987;-0.020460 0.366393 0.018122;0.029987 0.018122 0.330042]
y en Octava, obtengo un reflejo con[Ve,D] = eig(C)
y una rotación con[U,S,V] = svd(C)
. ¿Cómo se hace cuando necesito una rotación para visualizar el elipsoide de confianza?