2016-04-27 8 views
2

正しくないようです。 Scikit-Learnを使用すると、回帰が正しいように見えますが、n = k;すなわち、予測子の行列が正方形である場合。 Iがランダムscikit学習係数は真の係数と同じであることを確認するために使用して回帰を実行し、その後、yを構成するマトリックスXと係数b発生以下MWE、検討:Scikit-を学ぶ線形回帰私は直線<code>k</code> X <code>n</code>予測変数<code>X</code>、K> = nの上に<code>k</code>応答変数<code>y</code>を回帰しています

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'です。回帰が意味をなさせるためには '' k 'より厳密に '' n' '大きくする必要があります。それについて考えると、 'k = 1'をイメージして、予測しようとしている変数を1つだけ持つことができます。つまり、線の勾配を計算しようとしています。これを計算するには、少なくとも2つのポイントが必要なので、 'n> 2'が必要です。 – maxymoo

+0

@maxymooいいえ、正しいコードです。これは、システムを解くときにnp.linalgからlstsqを正方行列に、k> = nでscikit-learnを使って解きます。私はscikit-learnにバグがあると信じています。 – bcf

答えて

1

デフォルトでは、LinearRegressionクラスの属性fit_interceptTrueに設定されています。これには2つの効果があるようです。最初に、linalg.lstsqを使用してモデルを適合させる前に、Xおよびyの行列は、_center_dataメソッドの平均を差し引いて中央に配置されます。第二に、モデルの後、_set_interceptセットフィットです:

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

それは、この切片項を導出する方法を文書から明らかになっていません。あなたのケースでは

、あなたはk > n結果intercept_用語は1e-14のオーダーであるが、k = nため、intercept_k = nの場合には、なぜ、係数ベクトルの不一致を説明する、非ゼロである場合にはそれを調べることができます。あなたのモデルにfit_intercept=Falseを設定するだけで、これをすべて修正することができます。

警告:より意味のある答えは、もちろん、切片項が導出される方法を説明し、同様に切片項がk > nゼロである理由について洞察を提供するかもしれません。

関連する問題