2

ウィキで説明されているように、加重最小二乗回帰を実行しています:WLS

この方程式を解く必要があります:$ B =(t(X)W X)^ {-1} * t(X)W y $

私はSVDを使用して、$(t(X)W X)^ {-1} $を見つけ、それを行列に格納します。さらに、行列$ H =(t(X)W X)^ {-1} * t(X)W $を格納し、yの新しい値に対して次のようにします。B= Hy。このようにして、yの変化に応じてSVDと行列の乗算を繰り返すコストを節約できます。

Wは対角行列であり、通常は変化しません。ただし、W行列の対角線上の1つまたは2つの要素を変更することがあります。その場合、SVDを再度実行し、H行列を再計算する必要があります。これは明らかに遅く、時間がかかります。

私の質問は次のとおりです。Wで何が変更され、Xで何も変更されていない場合、(t(X)W X)^-1を再計算するためのより効率的な方法はありますか?

言い換えると、Wの対角要素のみが既知の量だけ変化する可能性がある場合、Bを見つけるための効率的な分析方法はありますか?

4

1 に答える 1

3

計算する逆行列が真の逆行列であり、一般化された逆行列ではない場合 (つまり、特異値が 0 でない場合) には、このような方法があります。ただし、これを使用する際には注意が必要です。合計を無限の精度で行っていれば、すべてうまくいくでしょう。精度が有限であり、特に特異値に近い問題 (特異値の一部が非常に大きい場合) では、これらの式は精度が失われる可能性があります。

ストア C を逆関数と呼びます。m 番目の重みに d (正または負) を追加すると、変更された C 行列 C~ と、変更された H である H~ は、次のように計算できます。これ:

(' は転置を表し、e_m は、m 番目のスロットが 1 であることを除いて、すべて 0 の行のベクトルです)

させて

c = the m'th column of H, divided by the original m'th weight    
a = m'th row of the data matrix X    
f = e_m - a*H    
gamma = 1/d + a*c

(したがって、c は列ベクトルであり、a と f は行ベクトルです)

それで

C~ = C - c*c'/gamma
H~ = H + c*f/gamma

与えられた y に対して新しい B、たとえば B~ を見つけたい場合は、次の方法で計算できます。

r = y[m] - a*B
B~ = B + (r/gamma) * c

これらの式の導出は簡単ですが、面倒な行列代数です。逆行列補題が役に立ちます。

于 2012-11-15T18:28:38.453 に答える