linear-regression - 权重变化时有效重新计算加权最小二乘回归

标签 linear-regression linear-algebra eigen ublas

我正在执行加权最小二乘回归,如 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/

相关文章:

r - 根据r中的条件提取模型

algorithm - 3d 空间中最接近多条线的 3d 点

algorithm - 如果要加密的字母数发生变化,Hill Cipher key 是否会有所不同?

c++ - 如何调用模板类的析构函数?

c++ - Eigen:是否有计算样本协方差的内置方法

python-3.x - 如何找到回归线与 OY 轴相交的点?

matlab - 使用 Octave\MatLab 进行 ML 梯度下降成本函数的简单演算到底是如何工作的?

r - CVlm {DAAG} : setting printit = FALSE causes an issue - object 'sumss' not found

python - 我的 PCA 有什么问题?

eigen - 按行线程安全写入 Eigen::MatrixXd