numpy
Algebra lineare con np.linalg
Ricerca…
Osservazioni
A partire dalla versione 1.8, molte delle routine in np.linalg
possono operare su una "pila" di matrici. Cioè, la routine può calcolare i risultati per più matrici se sono raggruppate insieme. Ad esempio, A
qui viene interpretato come due matrici 3-per-3 sovrapposte:
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])
I documenti ufficiali np
specificano tramite parametri come a : (..., M, M) array_like
.
Risolvi i sistemi lineari con np.solve
Considera le seguenti tre equazioni:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
Possiamo esprimere questo sistema come un'equazione di matrice A * x = b
con:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
Quindi, usa np.linalg.solve
per risolvere x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
deve essere una matrice quadrata e full-rank: tutte le sue righe devono essere linearmente indipendenti. A
dovrebbe essere invertibile / non singolare (il suo determinante non è zero). Ad esempio, se una riga di A
è un multiplo di un'altra, chiamando linalg.solve
si alza 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])
Tali sistemi possono essere risolti con np.linalg.lstsq
.
Trova la soluzione dei minimi quadrati su un sistema lineare con np.linalg.lstsq
I minimi quadrati rappresentano un approccio standard ai problemi con più equazioni rispetto alle incognite, noti anche come sistemi sovradeterminati.
Considera le quattro equazioni:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
Possiamo esprimere questo come una moltiplicazione di matrice 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])
Quindi risolvi con np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
è la soluzione, residuals
la somma, rank
il rango matrice dell'input A
ed s
valori singolari di A
Se b
ha più di una dimensione, lstsq
risolverà il sistema corrispondente a ciascuna colonna di 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
e s
dipendono solo A
, e sono quindi lo stesso come sopra.