考虑以下对最小二乘逆问题的正规方程的加权解:
m = inv(G'*W'*W*G)*G'*W'*W*d
我想设置加权矩阵W
,这是一个方形对角矩阵,对角线上有权重。
由于我在d(10⁷)中有大量数据点,我的系统矩阵G
也很大,但只在一个维度上(因为我有比模型参数多得多的数据点)。在6个模型参数的情况下,G
的大小(10⁷×6)。因此,W
必须大小(10⁷×10⁷)。但是,它很稀疏,只有10⁷非零项(权重)。
为减少记忆,我在W
上使用稀疏。
要分配权重,我会执行以下操作
d = [d1;d2];
W = sparse(length(d),length(d))
w1 = length(d2)/length(d);
w2 = length(d1)/length(d);
W(1:length(d)+1:length(d)*length(d1)) = w1;
W(length(d)*length(d1)+1:length(d)+1:end) = w2;
d1
和d2
是带有观察值的列向量。
这将为对角线分配权重,但速度非常慢。
我的问题:
我可以
吗?m = inv(G'*W'*W*G)*G'*W'*W*d
,以便我根本不需要设置W
?注1:显示的权重是两个不同的常数,但实际上它们会因对角线的不同而变化!
注2:代码的瓶颈确实设置了W
,而不是反转本身,因为反转矩阵只有大小(6×6)。
答案 0 :(得分:0)
根据W
的结构,我认为将G
分成两半并使用W
计算产品作为标量产品更有效:
G1 = G(1:length(d1),:);
G2 = G(length(d1)+1:end,:);
m = (w1^2*G1'*G1 + w2^2*G2'*G2) \ (w1^2*G1'*d1 + w2^2*G2'*d2);
此外,通常使用A \ b
代替inv(A)*b
(即使A
很小)。