我线性回归k
响应变量y
到上k
X n
预测变量X
,其中k> = N。使用Scikit-Learn,回归似乎是正确的,除了n = k
;即,当预测器的矩阵是正方形时。考虑下面的MWE,其中I随机生成矩阵X
和系数b
构建y
,然后使用scikit学习来检查系数是一样的真系数执行回归:Scikit-了解线性回归上方阵似乎不正确
import numpy as np
from sklearn import linear_model
n = 5 # number of predictor variables
k = 5 # number of response variables, >= n *** Set = n for issue ***
mu_b = 2.0 # mean of each component of b, used to create coeffs
print "n = ", n
# generate true coefficients ~ N(2,0.09)
b = np.random.normal(2.0, 0.3, n)
print "b = ", b
# generate true predictors ~ N(0,25)
X = np.random.normal(0.0, 5.0, (k,n))
# generate true target variables
y = X.dot(b)
# create linear regression object
regr = linear_model.LinearRegression()
# train model
regr.fit(X,y)
# print coeffs
print "estimated b = ", regr.coef_
# print difference
print "difference = ", np.linalg.norm(b - regr.coef_)
若k> n没有差模的机器精度,但是当k = n时,可能会有很大的差别。有人遇到过这种情况么?这是一个已知的错误?
我认为你会让你的概念混淆起来,在你的代码中它看起来像'k'是预测变量的数量,'n'是样本大小;你需要使'n'严格大于'k'才能使回归更加合理。考虑一下,给你一个'k = 1'的图像,这样你就可以得到一个你想要预测的变量,即你正在计算一条线的梯度。你至少需要两点来计算这个值,所以你必须有'n> 2'。 – maxymoo
@maxymoo不,它的代码正确。当我解决系统使用np.linalg中的lstsq作为方形矩阵时,以及k> = n时使用scikit-learn,它起作用。我相信scikit-learn中存在一个错误。 – bcf