2016-04-12 1 views
3

の違い私は理解しているように、numpy.linalg.lstsqsklearn.linear_model.LinearRegressionは、両方のことがresdidual合計||Ax - y||を最小限に抑える、線形システムAx = yのソリューションxを探します。numpy.linalg.lstsqとsklearn.linear_model.LinearRegression

しかし、彼らは同じ結果与えていない:私は何を望むのです

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]) 

を?

+3

切片です。 :D – cel

+6

@celと唯一の違いは、傍受です。 'linear_model.LinearRegression(fit_intercept = False)'を実行すると、 'np.linalg.lstsq'と同じ結果が得られます。 –

+0

シンプルだが見落としやすいディテール。ありがとう! – fhchl

答えて

1

どちらもLPACK gelsdで実装されています。

違いは、linear_model.LinearRegressionは入力X(あなたのA)に対して以下のようにデータ前処理(デフォルト)を行います。しかしnp.linalg.lstsqはありません。データ前処理の詳細については、the source code of LinearRegressionを参照してください。

X = (X - X_offset)/X_scale 

あなたはデータの前処理をしない場合は、fit_intercept=Falseを設定する必要があります。

簡潔に言えば、線形回帰の前に入力を正規化すると、次のようにlinear_model.LinearRegressionnp.linalg.lstsqの両方で同じ結果が得られます。

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

今、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]) 
関連する問題