リッジのMATLABの実装に混乱


8

ridgeMATLAB には2つの異なる実装があります。1つは単に

  1. x=(AA+Iλ)1Ab

    ウィキペディアのリッジ回帰ページで見られるように)、とI サイズ列の単位行列であること(A× 列(A)、および

  2. 私は単にMatlabの「尾根」を

    x = ridge(A, b, lambda)

私の問題は、どちらも異なる結果を返すことです。(1)必要な結果を返します(他の人と結果を比較することでわかります)が、(2)同じ結果が返されないのはなぜですか?

私のマトリックス A疎で、1%1と99%0で埋められます。一部の列には1がほとんど含まれていません。最大の違いは、1が非常に少ない列の係数が(1)の0に非常に近いことですが、(2)の0からかなり離れている可能性があります

なぜそれが違うのか、そして(2)の呼び出しを変更して(1)と同じ結果を出すにはどうすればいいですか?


4
私の推測:あなたは(1)を非中心スケーリングされていない行列で計算しているのに対し、ridge(MATLABのドキュメントに従って)を呼び出すと、(標準として)次のように示されます。 0と標準偏差1。モデルには定数項が含まれておらず、Xに1の列が含まれていてはなりません。
枢機卿

センタリングとスケーリングが理由である場合、Matlab呼び出しで(1)と同じ結果が得られるように「A」と「b」を変更できますか?
Susie G.

1
こんにちは、スージー。はい、できます。最初に、すべてが定数の(ゼロ以外の)列がある場合A、 それを除く。さて、単に中心を合わせてスケーリングしますAを呼び出す前に自分自身ridge。あなたは何もする必要はないはずですb
枢機卿

(スパース性の詳細は無視しました。センタリングすると、スパース性が壊れます。非常に大きな Aこれにより、計算上問題が発生する可能性があります。)
枢機卿

回答:


6

これは枢機卿が言ったことを検証するためのMATLABプログラムです、それは実際にはセンタリングとスケーリングが原因です

% Create A(10 by 3 matrix) and b(10 by 1 matrix)
A=rand(10,3);
b=rand(10,1);
lambda=0.01
% centering and scaling A 
s=std(A,0,1);
s=repmat(s,10,1);
A=(A-repmat(mean(A),10,1))./s;

%check the result
X1=inv(A'*A+eye(3)*lambda)*A'*b;
X2=ridge(b,A,lambda,1);

x1はx2に等しい


0

隆起のスケールを0に特化する必要があるため、x = ridge(A、b、lambda、0)のようになります。この場合、xの最初の行は定数で、残りは係数です。つまり、x(2:end、:)は、(1)を使用して取得した結果と同じ結果になるはずです。これは、mathlabのドキュメントに明記されています。これが役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.