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

标签 python numpy scipy scikit-learn linear-regression

据我了解,numpy.linalg.lstsqsklearn.linear_model.LinearRegression两者都寻找线性系统 Ax = y 的解决方案 x,使残差和 ||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])

我忽略了什么?

最佳答案

两者都是由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])

关于python - numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573046/

相关文章:

python - 生成排除特定序列的 DNA 序列

python - 数组某些值的平均值

python - Numpy Logarithm 适用于 bool Pandas 系列,但不适用于 Dataframe 中的 bool 列

python - 稀疏 SciPy 矩阵与两个 NumPy 向量的矩阵乘法

python - 如何优化参数取决于自变量的函数的拟合

python - 提取二维二进制数组的索引

python - Spyder 3.3.3帮助输入框问题: can only type 1 character

javascript - 如何解析和提取javascript类方法?

python - 将 newrelic 添加到通过 dokku 部署的 python 堆栈 (django)

python - 错误: cannot import name 'SpearmanRConstantInputWarning' from 'scipy.stats'