Calcular Matrix Rank utilizando scipy

Me gustaría calcular el rango matemático de una matriz usando scipy. La función más obvia numpy.rank calcula la dimensión de una matriz (es decir, los escalares tienen dimensión 0, vectores 1, matrices 2, etc.). Soy consciente de que el módulo numpy.linalg.lstsq tiene esta capacidad, pero me preguntaba si tal operación fundamental está integrada en la clase de matriz en algún lugar.

Aquí hay un ejemplo explícito:

 from numpy import matrix, rank A = matrix([[1,3,7],[2,8,3],[7,8,1]]) print rank(A) 

Esto le da a 2 la dimensión, donde estoy buscando una respuesta de 3 .

Related of "Calcular Matrix Rank utilizando scipy"

Numpy proporciona numpy.linalg.matrix_rank() :

 >>> import numpy >>> numpy.__version__ '1.5.1' >>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]]) >>> numpy.linalg.matrix_rank(A) 3 

Para proporcionar un fragmento de código aproximado para las personas que necesitan hacer esto en la práctica. Siéntete libre de mejorar.

 u, s, v = np.linalg.svd(A) rank = np.sum(s > 1e-10) 

Si numpy no ofrece un servicio de rango, ¿por qué no escribes el tuyo?

Una forma eficiente de calcular el rango es a través de la descomposición del valor singular: el rango de la matriz es igual al número de valores singulares distintos de cero.

 def rank(A, eps=1e-12): u, s, vh = numpy.linalg.svd(A) return len([x for x in s if abs(x) > eps]) 

Tenga en cuenta que eps depende de su aplicación; la mayoría estaría de acuerdo en que 1e-12 corresponde a cero, pero puede ser testigo de inestabilidad numérica incluso para eps = 1e-9.

Usando tu ejemplo, la respuesta es tres. Si cambia la segunda fila a [2, 6, 14] (dependiente linealmente de la fila uno), la respuesta es dos (el valor propio “cero” es 4.9960E-16)

Esta respuesta está desactualizada.

La respuesta es no: actualmente no hay una función dedicada a calcular el rango de matriz de una matriz / matriz en scipy. Agregar uno se ha discutido antes, pero si va a suceder, no creo que lo haya hecho todavía.

No conozco a Numpy en particular, pero es poco probable que sea una operación integrada en una matriz; involucra cálculos numéricos bastante intensivos (y las preocupaciones asociadas sobre el error de redondeo de punto flotante, etc.) y las selecciones de umbrales que pueden o no ser apropiadas en un contexto dado, y la selección de algoritmos es importante para calcularlo con precisión y rapidez.

Las cosas que están integradas en las clases básicas tienden a ser cosas que se pueden realizar de una manera única y directa, como las multiplicaciones de matrices en la forma más compleja.

Las funciones de álgebra lineal generalmente se agrupan en numpy.linalg . (También están disponibles en scipy.linalg , que tiene más funcionalidad). Esto permite el polymorphism: las funciones pueden aceptar cualquiera de los tipos que maneja SciPy.

Entonces, sí, la función numpy.linalg.lstsq hace lo que estás preguntando. ¿Por qué es eso insuficiente?

scipy ahora contiene un método interpolativo eficiente para estimar el rango de una matriz / LinearOperator utilizando métodos aleatorios, que a menudo pueden ser lo suficientemente precisos:

 >>> from numpy import matrix >>> A = matrix([[1,3,7],[2,8,3],[7,8,1]], dtype=float) # doesn't accept int >>> import scipy.linalg.interpolative as sli >>> sli.estimate_rank(A, eps=1e-10) 3