2016-04-12 13 views
3

Wie ich verstehe, numpy.linalg.lstsq und sklearn.linear_model.LinearRegression aussehen sowohl für Lösungen x des linearen Systems Ax = y, dass die resdidual Summe ||Ax - y|| minimieren.Unterschied zwischen numpy.linalg.lstsq und sklearn.linear_model.LinearRegression

Aber sie geben nicht das gleiche Ergebnis:

from sklearn import linear_model 
import numpy as np 

A = np.array([[1, 0], [0, 1]]) 
b = np.array([1, 0]) 
x , _, _, _ = np.linalg.lstsq(A,b) 
x 

Out[1]: array([ 1., 0.]) 

clf = linear_model.LinearRegression() 
clf.fit(A, b)        
coef = clf.coef_ 
coef 

Out[2]: array([ 0.5, -0.5]) 

Was bin ich mit Blick auf?

+3

der abfangen. : D – cel

+6

Als @cel nooted ist der einzige Unterschied der Intercept. Sie können tun, 'linear_model.LinearRegression (fit_intercept = False)' das gleiche Ergebnis wie 'np.linalg.lstsq' zu bekommen. –

+0

Ein einfaches, aber leicht zu übersehendes Detail. Vielen Dank! – fhchl

Antwort

1

Beide werden von LPACK gelsd implementiert.

Der Unterschied ist, dass linear_model.LinearRegression Daten vorverarbeiten (Standard) wie unten für Eingang X (Ihr A). Aber np.linalg.lstsq nicht. Weitere Informationen zum Datenvorprozess finden Sie unter the source code of LinearRegression.

X = (X - X_offset)/X_scale 

Wenn Sie die Daten nicht Vorprozess wollen, sollten Sie fit_intercept=False gesetzt.

Kurz gesagt, wenn Sie Ihre Eingabe vor der linearen Regression normalisieren, erhalten Sie das gleiche Ergebnis von beiden linear_model.LinearRegression und np.linalg.lstsq wie unten.

# Normalization/Scaling 
from sklearn.preprocessing import StandardScaler 
A = np.array([[1, 0], [0, 1]]) 
X_scaler = StandardScaler() 
A = X_scaler.fit_transform(A) 

Jetzt A array([[ 1., -1.],[-1., 1.]])

from sklearn import linear_model 
import numpy as np 

b = np.array([1, 0]) 
x , _, _, _ = np.linalg.lstsq(A,b) 
x 
Out[1]: array([ 0.25, -0.25]) 

clf = linear_model.LinearRegression() 
clf.fit(A, b)        
coef = clf.coef_ 
coef 

Out[2]: array([ 0.25, -0.25])