numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 之间的区别
Difference between numpy.linalg.lstsq and sklearn.linear_model.LinearRegression
据我了解,numpy.linalg.lstsq
and sklearn.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.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])
据我了解,numpy.linalg.lstsq
and sklearn.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.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])