python - transpuesta - numpy matrix multiplication
¿Cuál es la forma más rápida de encontrar valores propios/vectores en python? (2)
Actualmente estoy usando Numpy, que hace el trabajo. Pero, como estoy lidiando con matrices con varios miles de filas / columnas y más tarde esta cifra aumentará a decenas de miles, me preguntaba si existe un paquete que pueda realizar este tipo de cálculos más rápido.
Si sus matrices son dispersas, puede intentar usar la función de valor propio escaso de scipy, que debería ser más rápida:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html
También puede consultar paquetes especializados como SLEPc, que tiene enlaces de python y puede hacer cálculos en paralelo usando mpi:
** si su matriz es escasa, entonces cree una instancia de su matriz usando un constructor de scipy.sparse y luego use los métodos análogos eigen / eigenveces en spicy.sparse.linalg . Desde el punto de vista del rendimiento, esto tiene dos ventajas:
su matriz, construida a partir del constructor spicy.sparse, será más pequeña en proporción a lo escaso que sea.
los métodos eigenvalue / eigenvector para matrices dispersas ( eigs , eigsh ) aceptan un argumento opcional, k que es el número de pares eigenvector / eigenvalue que desea devolver. Casi siempre el número requerido para representar el> 99% de la varianza es mucho menor que el número de columnas, que puede verificar ex post ; en otras palabras, puede indicar al método que no calcule y devuelva todos los pares eigenvectores / pares de valores propios: más allá del subconjunto pequeño (normalmente) requerido para explicar la varianza, es poco probable que necesite el resto.
utilice la biblioteca de álgebra lineal en SciPy , scipy.linalg , en lugar de la biblioteca NumPy del mismo nombre. Estas dos bibliotecas tienen el mismo nombre y usan los mismos nombres de método. Sin embargo, hay una diferencia en el rendimiento. Esta diferencia es causada por el hecho de que numpy.linalg es un envoltorio menos fiel en las rutinas LAPACK análogas que sacrifican algún rendimiento por portabilidad y conveniencia (es decir, para cumplir con el objetivo de diseño de NumPy de que toda la biblioteca NumPy se construya sin Fortran compilador). linalg en SciPy por otro lado es un envoltorio mucho más completo en LAPACK y que usa f2py .
seleccione la función apropiada para su caso de uso ; en otras palabras, no usar una función hace más de lo que necesita. En scipy.linalg hay varias funciones para calcular valores propios; las diferencias no son grandes, aunque mediante una elección cuidadosa de la función para calcular valores propios, debería ver un aumento de rendimiento. Por ejemplo:
- scipy.linalg.eig devuelve los valores propios y vectores propios
- scipy.linalg.eigvals , devuelve solo los valores propios. Entonces, si solo necesita los valores propios de una matriz, entonces no use linalg.eig , use linalg.eigvals en su lugar.
- si tiene matrices cuadradas simétricas de valor real (igual a su transposición) entonces use scipy.linalg.eigsh
Optimice su compilación de Scipy. La preparación de su entorno de compilación de SciPy se realiza en gran medida en el script setup.py de SciPy. Quizás la opción más importante para el rendimiento es identificar cualquier biblioteca LAPACK optimizada como ATLAS o Accelerate / vecLib framework (¿solo OS X?) Para que SciPy pueda detectarlas y compilar contra ellas. Dependiendo de la plataforma que tenga en este momento, la optimización de su compilación SciPy y la reinstalación pueden darle un aumento sustancial en el rendimiento. Notas adicionales del equipo central de SciPy están here .
¿Funcionarán estas funciones para matrices grandes?
Debería pensarlo. Estos son métodos de descomposición de la matriz de resistencia industrial, y que son solo envoltorios delgados sobre las rutinas análogas Fortran LAPACK .
He utilizado la mayoría de los métodos en la biblioteca de linalg para descomponer matrices en las que el número de columnas suele oscilar entre 5 y 50, y en las que el número de filas suele exceder de 500.000. Ni los métodos SVD ni los autovalores parecen tener ningún problema para manejar matrices de este tamaño.
Utilizando la biblioteca SciPy linalg puede calcular vectores propios y valores propios, con una sola llamada, utilizando cualquiera de los diversos métodos de esta biblioteca, eig , eigvalsh y eigh .
>>> import numpy as NP
>>> from scipy import linalg as LA
>>> A = NP.random.randint(0, 10, 25).reshape(5, 5)
>>> A
array([[9, 5, 4, 3, 7],
[3, 3, 2, 9, 7],
[6, 5, 3, 4, 0],
[7, 3, 5, 5, 5],
[2, 5, 4, 7, 8]])
>>> e_vals, e_vecs = LA.eig(A)