48 votos

¿Por qué Andrew Ng prefiere utilizar la SVD y no la EIG de la matriz de covarianza para hacer el ACP?

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.

0voto

puudeli Puntos 369

Si se aplica la SVD a la matriz de covarianza, los vectores principales son los mismos que si se aplica la SVD a la matriz de datos. Por lo tanto, matemáticamente son equivalentes en este caso.

Sin embargo, en términos de complejidad, no tiene mucho sentido aplicar la SVD a la matriz de covarianza: se ha construido la matriz de covarianza y luego se paga la SVD, que es más cara que el cálculo de los vectores propios.

La mejor práctica es aplicar la SVD directamente sobre la matriz de datos, para ahorrar algunos flops (en comparación con la forma de Andrew Ng) y para lograr la estabilidad numérica de las rutinas SVD (en comparación con la eigendecomposición).

0voto

wcochran Puntos 111

Si a alguien le interesa la diferencia de rendimiento en un caso concreto, he comparado SVD y Eigen-análisis en una matriz simétrica real L de 632x632 utilizando C++/Eigen . Utilicé BDCSVD

// compute full V, U *not* needed
Eigen::BDCSVD<Eigen::MatrixXf> svd(L,Eigen::ComputeFullV);

y SelfAdjointEigenSolver

Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigenSolver(N);
eigenSolver.compute(L);

y ejecutamos cada bloque de código 100 veces ( clang++ -O3 -DNEBUG ) en un 3.2 Ghz Intel Core i5 Mac. Estos son los resultados:

 BCSSVD ..................... 10036 milliseconds
 SelfAdjointEigenSolver ..... 10338 milliseconds

Así que cada uno tarda unos 100 mseg para una sola llamada. Así que un empujón en cuanto a la velocidad.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X