Me gustaría utilizar el análisis de componentes principales (PCA) para la reducción de dimensionalidad. ¿Numpy o scipy ya lo tienen, o tengo que enrollar mi propio uso numpy.linalg.eigh
?
No solo quiero usar la descomposición de valores singulares (SVD) porque mis datos de entrada son de dimensiones bastante altas (~ 460 dimensiones), por lo que creo que SVD será más lento que calcular los autovectores de la matriz de covarianza.
Esperaba encontrar una implementación depurada y prefabricada que ya tome las decisiones correctas sobre cuándo usar qué método y que tal vez haga otras optimizaciones que no conozco.
Note that from this release MDP is in maintenance mode. 13 years after its first public release, MDP has reached full maturity and no new features are planned in the future.
Meses después, aquí hay un PCA de clase pequeña y una imagen:
fuente
El uso de PCA
numpy.linalg.svd
es muy fácil. Aquí hay una demostración simple:fuente
svd
ya regresas
ordenado en orden descendente, en lo que respecta a la documentación. (Quizás este no fue el caso en 2012, pero hoy lo es)Puedes usar sklearn:
fuente
matplotlib.mlab tiene una implementación de PCA .
fuente
SVD debería funcionar bien con 460 dimensiones. Tarda unos 7 segundos en mi netbook Atom. El método eig () requiere más tiempo (como debería, usa más operaciones de coma flotante) y casi siempre será menos preciso.
Si tiene menos de 460 ejemplos, entonces lo que quiere hacer es diagonalizar la matriz de dispersión (x - media de datos) ^ T (x - media), asumiendo que sus puntos de datos son columnas, y luego multiplicar por la izquierda por (x - media de datos). Eso podría ser más rápido en el caso de que tenga más dimensiones que datos.
fuente
Puede fácilmente "rodar" el suyo usando
scipy.linalg
(asumiendo un conjunto de datos precentradodata
):Entonces
evs
son sus valores propios yevmat
es su matriz de proyección.Si desea mantener las
d
dimensiones, utilice los primerosd
valores propios y los primerosd
vectores propios.Dado que
scipy.linalg
tiene la descomposición y muchas multiplicaciones de matrices, ¿qué más necesitas?fuente
eig()
en una matriz de covarianza.Acabo de terminar de leer el libro Machine Learning: An Algorithmic Perspective . Todos los ejemplos de código del libro fueron escritos por Python (y casi con Numpy). Quizás valga la pena leer el fragmento de código del análisis de componentes principales de chatper10.2 . Utiliza numpy.linalg.eig.
Por cierto, creo que SVD puede manejar muy bien dimensiones de 460 * 460. He calculado un SVD de 6500 * 6500 con numpy / scipy.linalg.svd en una PC muy antigua: Pentium III 733mHz. Para ser honesto, el guión necesita mucha memoria (aproximadamente 1.xG) y mucho tiempo (aproximadamente 30 minutos) para obtener el resultado de SVD. Pero creo que 460 * 460 en una PC moderna no será un gran problema a menos que necesite hacer SVD una gran cantidad de veces.
fuente
No necesita la descomposición de valores singulares (SVD) completa, ya que calcula todos los valores propios y los vectores propios y puede ser prohibitivo para matrices grandes. scipy y su módulo disperso proporcionan funciones de álgrebra lineal genéricas que trabajan tanto en matrices dispersas como densas, entre las que se encuentra la familia de funciones eig *:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations
Scikit-learn proporciona una implementación de Python PCA que solo admite matrices densas por ahora.
Tiempos:
fuente
eigsh
realidad es ~ 4 veces más lento queeigh
para matrices no dispersas. Lo mismo es cierto parascipy.sparse.linalg.svds
versusnumpy.linalg.svd
. Siempre iría con SVD sobre la descomposición de valores propios por las razones que mencionó @dwf, y tal vez usaría una versión escasa de SVD si las matrices se vuelven realmente enormes.eigsh
ysvds
son más rápidos queeigh
ysvd
por un factor de ~ 3, pero si A es más pequeño, digamos 100 * 100, entonceseigh
ysvd
son más rápidos por factores de ~ 4 y ~ 1,5 respectivamente . Sin embargo, T todavía usaría SVD escasa sobre la descomposición escasa de valores propios.Aquí hay otra implementación de un módulo PCA para Python usando extensiones numpy, scipy y C. El módulo lleva a cabo PCA utilizando un algoritmo SVD o NIPALS (Mínimos Cuadrados Parciales Iterativos No Lineales) que se implementa en C.
fuente
Si está trabajando con vectores 3D, puede aplicar SVD de manera concisa usando el toolbelt vg . Es una capa ligera encima de numpy.
También hay un alias conveniente si solo desea el primer componente principal:
Creé la biblioteca en mi última puesta en marcha, donde fue motivada por usos como este: ideas simples que son detalladas u opacas en NumPy.
fuente