2016-04-27 32 views
2

我线性回归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时,可能会有很大的差别。有人遇到过这种情况么?这是一个已知的错误?

+0

我认为你会让你的概念混淆起来,在你的代码中它看起来像'k'是预测变量的数量,'n'是样本大小;你需要使'n'严格大于'k'才能使回归更加合理。考虑一下,给你一个'k = 1'的图像,这样你就可以得到一个你想要预测的变量,即你正在计算一条线的梯度。你至少需要两点来计算这个值,所以你必须有'n> 2'。 – maxymoo

+0

@maxymoo不,它的代码正确。当我解决系统使用np.linalg中的lstsq作为方形矩阵时,以及k> = n时使用scikit-learn,它起作用。我相信scikit-learn中存在一个错误。 – bcf

回答

1

默认情况下,LinearRegression类的属性fit_intercept设置为True。这似乎有两个影响。首先,在使用linalg.lstsq拟合模型之前,矩阵Xy通过减去_center_data方法中的平均值而居中。二,型号后合身,_set_intercept集:

regr.intercept_ = y_mean - np.dot(X_mean, regr.coef_.T) 

它不是从文档此截距项是如何得出明确。

在你的情况,你可以检查,遇有k > n产生的intercept_项是1e-14的顺序,但对于k = nintercept_是非零的,解释为什么在k = n的情况下系数向量不匹配。只需在模型中设置fit_intercept=False即可解决所有这些问题。

买者:一个更有意义的答案,当然,或许可以解释截距项是如何得出的,以及提供洞察,为什么截距项是k > n为零。