2

我正在执行wiki上描述的加权最小二乘回归: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= H y。这样我就可以节省随着 y 的变化而重复 SVD 和矩阵乘法的成本。

W是对角矩阵,一般不会改变。但是有时我会更改 W 矩阵对角线上的一两个元素。在那种情况下,我需要再次执行 SVD 并重新计算 H 矩阵。这显然是缓慢且耗时的。

我的问题是:如果我知道 W 发生了什么变化而 X 没有任何变化,是否有更有效的方法来重新计算 (t(X) W X)^-1?

或者换句话说,考虑到只有 W 中的对角线元素可以改变已知量,是否有一种有效的分析方法可以找到 B?

4

1 回答 1

3

有这样一种方法,如果您计算的逆是真正的逆而不是广义逆(即,没有一个奇异值是 0)。但是,建议在使用时谨慎一些。如果您以无限精确的方式计算总和,一切都会好起来的。对于有限的精度,特别是对于几乎奇异的问题——如果某些奇异值非常大——这些公式可能会导致精度损失。

我将调用逆存储 C。如果将 d(可以是正数或负数)添加到第 m 个权重,那么修改后的 C 矩阵,C~ 说,和修改后的 H,H~,可以计算如下这:

(' 表示转置,e_m 为全为 0 的向量行,除了第 m 个槽为 1)

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

这些公式的推导是直截了当但乏味的矩阵代数。矩阵求逆引理派上用场了。

于 2012-11-15T18:28:38.453 回答