我正在执行wiki:WLS 上描述的加权最小二乘回归
我需要解这个方程:$B=(t(X)WX)^{-1}*t(X)Wy$
我使用SVD找到:$(t(X)WX)^{-1}$并将其存储在矩阵中。此外,我存储矩阵$H=(t(X)WX)^{-1}*t(X)W$,并简单地对y的任何新值执行以下操作:B=Hy。通过这种方式,我可以节省在y变化时重复SVD和矩阵乘法的成本。
W是对角矩阵,并且通常不改变。然而,有时我会改变W矩阵中对角线上的一个或两个元素。在这种情况下,我需要再次进行SVD并重新计算H矩阵。这显然是缓慢和耗时的。
我的问题是:如果我知道W发生了什么变化,而X没有变化,有没有更有效的方法来重新计算(t(X)WX)^-1?
或者换言之,在W中只有对角元素可以改变已知量的情况下,有没有一种有效的分析方法可以找到B?
有这样一种方法,如果你计算的逆是真逆,而不是广义逆(即奇异值都不是0)。但是,建议在使用时要小心。如果你在做无限精确的算术,一切都会好起来的。对于有限精度,特别是对于几乎奇异的问题——如果一些奇异值非常大——这些公式可能会导致精度损失。
我称之为逆,你存储C。如果你把d(可以是正的或负的)加到第m个权重上,那么修改后的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
如果你想找到新的B,比如说,对于给定的y,它可以通过计算
r = y[m] - a*B
B~ = B + (r/gamma) * c
这些公式的推导是简单而乏味的矩阵代数。矩阵反演引理派上用场。