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

问题描述 投票:0回答:1

据我了解,

numpy.linalg.lstsq
sklearn.linear_model.LinearRegression
都在寻找线性系统
x
的解决方案
Ax = y
,从而最小化残差和
||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])

我忽略了什么?

python numpy scipy scikit-learn linear-regression
1个回答
8
投票

两者都是由LPACK gelsd实现的。

区别在于

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

X = (X - X_offset) / X_scale

如果您不想进行数据预处理,则应设置

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)

现在 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])
© www.soinside.com 2019 - 2024. All rights reserved.