2014-11-25 17 views
6

so come risolvere AX = B con i minimi quadrati utilizzando python:Come usare minimi quadrati con matrice di peso in python?

Esempio:

A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]] 
B=[1,1,1,1,1] 
X=numpy.linalg.lstsq(A, B) 
print X[0] 
# [ 5.00000000e-01 5.00000000e-01 -1.66533454e-16 -1.11022302e-16] 

Ma per quanto riguarda la soluzione di questo stessa equazione con una matrice di peso non essendo Identità:

A.X = B (W) 

Esempio:

A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]] 
B=[1,1,1,1,1] 
W=[1,2,3,4,5] 

Grazie da adva nce,

+1

Hai guardato questo link: http://stackoverflow.com/questions/19624997/understanding-scipys-least-square-function-with-irls – xnx

+0

Sì; Ho provato: B = numpy.dot (B, W) prima di risolvere, ma ho un messaggio: numpy.linalg.linalg.LinAlgError: array a 0 dimensioni dato. La matrice deve essere bidimensionale –

+2

Se si prende il prodotto punto di due array monodimensionali, si otterrà uno scalare. Forse intendi semplicemente moltiplicare gli elementi di B per quelli di W? Meglio usare gli array numpy piuttosto che gli elenchi Python qui. – xnx

risposta

4

ho trovato un altro approccio (usando W come una matrice diagonale, e prodotti matriciali):

A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]] 
B = [1,1,1,1,1] 
W = [1,2,3,4,5] 
W = np.sqrt(np.diag(W)) 
Aw = np.dot(W,A) 
Bw = np.dot(B,W) 
X = np.linalg.lstsq(Aw, Bw) 

Stessi valori e stessi risultati.

+1

il prodotto matrice è più costoso del prodotto element-saggio del suggerimento di @ xnx – DomTomCat

+1

potrebbe essere più costoso dal punto di vista computazionale, ma è molto più chiaro da leggere. +1 per chiarezza del codice con algebra lineare –

5

Non so come è stato definito il vostro peso, ma si potrebbe provare questo se del caso:

import numpy as np 
A=np.array([[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]) 
B = np.array([1,1,1,1,1]) 
W = np.array([1,2,3,4,5]) 
Aw = A * np.sqrt(W[:,np.newaxis]) 
Bw = B * np.sqrt(W) 
X = np.linalg.lstsq(Aw, Bw) 
+1

Grazie. Non conosco bene il numpy e devo capire che W [:, np.newaxis] (o W [:, None]) fornisce una matrice diagonale. Cioè array ([[1], [2], [3], [4], [5]]) significa una matrice diagonale 5x5 con questi valori sulla diagonale. –

+1

(È così? Perché il risultato Aw è un array 5x4, quindi questa è l'unica spiegazione) –

+1

Spiacente, sono stato confuso dall'operatore * (non ero abituato agli array). Non è un prodotto matrice, ma termine a termine. –