numpy
Álgebra lineal con np.linalg
Buscar..
Observaciones
A partir de la versión 1.8, varias de las rutinas en np.linalg
pueden operar en una 'pila' de matrices. Es decir, la rutina puede calcular resultados para matrices múltiples si se apilan juntas. Por ejemplo, A
aquí se interpreta como dos matrices apiladas de 3 por 3:
np.random.seed(123)
A = np.random.rand(2,3,3)
b = np.random.rand(2,3)
x = np.linalg.solve(A, b)
print np.dot(A[0,:,:], x[0,:])
# array([ 0.53155137, 0.53182759, 0.63440096])
print b[0,:]
# array([ 0.53155137, 0.53182759, 0.63440096])
Los documentos oficiales de np
especifican esto a través de especificaciones de parámetros como a : (..., M, M) array_like
.
Resolver sistemas lineales con np.solve.
Considera las siguientes tres ecuaciones:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
Podemos expresar este sistema como una ecuación matricial A * x = b
con:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
Luego, use np.linalg.solve
para resolver para x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
debe ser una matriz cuadrada y de rango completo: todas sus filas deben ser linealmente independientes. A
debe ser invertible / no singular (su determinante no es cero). Por ejemplo, si una fila de A
es un múltiplo de otra, llamar a linalg.solve
generará LinAlgError: Singular matrix
:
A = np.array([[1, 2, 1],
[2, 4, 2], # Note that this row 2 * the first row
[1, 0, 1]])
b = np.array([4,8,5])
Tales sistemas se pueden resolver con np.linalg.lstsq
.
Encuentre la solución de mínimos cuadrados para un sistema lineal con np.linalg.lstsq
Los cuadrados mínimos es un enfoque estándar para problemas con más ecuaciones que incógnitas, también conocidas como sistemas sobredeterminados.
Considera las cuatro ecuaciones:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
Podemos expresar esto como una multiplicación matricial A * x = b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([4,3,5,4])
Luego resuelve con np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
es la solución, residuals
la suma, rank
el rango de matriz de la entrada A
y s
los valores singulares de A
Si b
tiene más de una dimensión, lstsq
resolverá el sistema correspondiente a cada columna de b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([[4,3,5,4],[1,2,3,4]]).T # transpose to align dimensions
x, residuals, rank, s = np.linalg.lstsq(A,b)
print x # columns of x are solutions corresponding to columns of b
#[[ 2.05263158 1.63157895]
# [ 1.05263158 -0.36842105]
# [ 0.05263158 0.63157895]]
print residuals # also one for each column in b
#[ 0.84210526 5.26315789]
rank
y s
solo dependen de A
, y por lo tanto son los mismos que los anteriores.