我正按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。这样我就可以节省重复SVD和矩阵乘法的成本,因为y的变化。
W是对角矩阵,通常不会改变。然而,有时我会改变W矩阵中对角线上的一个或两个元素。在那种情况下,我需要再次进行SVD并重新计算H矩阵。这显然是缓慢而耗时的。
我的问题是:如果我知道W中的变化并且X中没有任何变化,那么有一种更有效的方法来重新计算(t(X) W X)^ - 1?
或者说不同的是,有一种有效的分析方法可以找到B,只有W中的对角线元素可以改变已知量?
答案 0 :(得分:2)
有这样一种方法,在你计算的逆是真逆并且不是广义逆的情况下(即没有奇异值是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派上用场。