我正在执行加权最小二乘回归,如 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 是全为 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,B~比如说,对于给定的y,可以通过以下方式计算:
r = y[m] - a*B
B~ = B + (r/gamma) * c
这些公式的推导是简单但乏味的矩阵代数。 matrix inversion lemma派上用场了。
关于linear-regression - 权重变化时有效重新计算加权最小二乘回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13377868/