numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 的区别

fhc*_*chl 5 python numpy scipy linear-regression scikit-learn

据我了解,numpy.linalg.lstsqsklearn.linear_model.LinearRegression双方寻求解决办法x的线性系统Ax = y,可以最大限度地减少resdidual总和||Ax - y||

但他们没有给出相同的结果:

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])
Run Code Online (Sandbox Code Playgroud)

我在看什么?

ybd*_*ire 8

它们都是由LPACK gelsd实现的。

不同之处在于,linear_model.LinearRegression将对输入 X(您的 A)进行数据预处理(默认),如下所示。但np.linalg.lstsq不要。关于数据预处理的更多细节可以参考LinearRegression的源码。

X = (X - X_offset) / X_scale
Run Code Online (Sandbox Code Playgroud)

如果您不想进行数据预处理,则应该设置fit_intercept=False.

简而言之,如果在线性回归之前对输入进行归一化,则 和 都会得到相同的结果,linear_model.LinearRegression如下np.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)
Run Code Online (Sandbox Code Playgroud)

现在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])
Run Code Online (Sandbox Code Playgroud)