正しくないようです。 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の場合はかなりの違いがあります。他に誰かがこれに遭遇しましたか?これは既知のバグですか?
私はあなたのコンセプトが混ざっていると思います。あなたのコードでは、予測変数の数は 'k'、サンプルサイズは' n'です。回帰が意味をなさせるためには '' k 'より厳密に '' n' '大きくする必要があります。それについて考えると、 'k = 1'をイメージして、予測しようとしている変数を1つだけ持つことができます。つまり、線の勾配を計算しようとしています。これを計算するには、少なくとも2つのポイントが必要なので、 'n> 2'が必要です。 – maxymoo
@maxymooいいえ、正しいコードです。これは、システムを解くときにnp.linalgからlstsqを正方行列に、k> = nでscikit-learnを使って解きます。私はscikit-learnにバグがあると信じています。 – bcf