繁体   English   中英

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

[英]Difference between numpy.linalg.lstsq and sklearn.linear_model.LinearRegression

据我所知, numpy.linalg.lstsqsklearn.linear_model.LinearRegression都寻找线性系统Ax = yx ,它最小化了剩余和||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没有。 您可以参考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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM