2012-11-14 3 views
1

je joue la régression des moindres carrés pondérés comme décrit wiki: WLSrecalcul efficace de la régression des moindres carrés pondérés lorsque les poids changent

que je dois résoudre cette équation: $ B = (t (X) W X)^{ -1} * t (X) W y

$

J'utilise SVD pour trouver: $ (t (X) W X)^{- 1} $ et le stocker dans une matrice. En outre je stocke la matrice $ H = (t (X) W X)^{- 1} * t (X) W $ et simplement faire ce qui suit pour toute nouvelle valeur de y: B = H y. De cette façon, je suis en mesure d'économiser le coût de la répétition des multiplications SVD et matricielles en tant que changement de y.

W est une matrice diagonale et ne change généralement pas. Cependant parfois je change un ou deux éléments sur la diagonale dans la matrice de W. Dans ce cas, je dois recommencer SVD et recalculer la matrice H. Ceci est clairement lent et prend du temps. Ma question est: Si je sais ce qui a changé dans W et que rien ne change dans X, y a-t-il une méthode plus efficace pour recalculer (t (X) W X)^- 1? Autrement dit, y a-t-il une méthode analytique efficace pour trouver B étant donné que seuls les éléments diagonaux dans W peuvent changer d'une quantité connue?

Répondre

2

Il existe une telle méthode, dans le cas où l'inverse que vous calculez est un vrai inverse et non un inverse généralisé (c.-à-d. Qu'aucune des valeurs singulières ne vaut 0). Cependant une certaine prudence dans l'utilisation de ceci est recommandée. Si vous faisiez vos calculs avec une précision infinie, tout irait bien. Avec une précision finie, et en particulier avec des problèmes presque singuliers - si certaines des valeurs singulières sont très grandes - ces formules pourraient entraîner une perte de précision. Je vais appeler inverse que vous stockez C. Si vous ajoutez d (qui peut être positif ou négatif) au poids m'th, alors la matrice C modifiée, C ~ say, et le H modifié, H ~, peut être calculée comme suit:

(» désigne la transposition, et E_M est rangée le vecteur qui est tout à 0, sauf la fente d'Mième est 1)

Let

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 

(si c est un vecteur de colonne, tandis que a et f sont des vecteurs de ligne)

Alors

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

Si vous voulez trouver le nouveau B, B ~ dire, pour un y donné, il peut être calculé via:

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

La dérivation de ces formules est simple, mais fastidieuse, algèbre matricielle. Le matrix inversion lemma est pratique.

+1

Cela fait l'affaire efficacement. Merci d'indiquer les mises en garde concernant les problèmes avec 0 valeurs singulières. – Atlas

Questions connexes