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

Posted

技术标签:

【中文标题】numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 的区别【英文标题】:Difference between numpy.linalg.lstsq and sklearn.linear_model.LinearRegression 【发布时间】:2016-08-03 01:15:42 【问题描述】:

据我了解,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])

我忽略了什么?

【问题讨论】:

正如@cel 所指出的,唯一的区别是截距。您可以通过linear_model.LinearRegression(fit_intercept=False) 获得与np.linalg.lstsq 相同的结果。 一个简单但容易忽略的细节。谢谢! 如果你们中的一个人会发布答案,我可以将此问题标记为已回答。 【参考方案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])

【讨论】:

以上是关于numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用scipy计算矩阵秩

使用 scipy 计算矩阵排名

手写数字识别分类器

学习笔记 | 机器学习 决策树

学习笔记 | 机器学习 决策树

如何规范 scikit learn 的 kde?