【发布时间】:2015-09-23 11:28:01
【问题描述】:
考虑最小二乘逆问题的正规方程的以下加权解:
m = inv(G'*W'*W*G)*G'*W'*W*d
我想设置权重矩阵W,这是一个对角线方阵,对角线上有权重。
由于我在 d (10⁷) 中有大量数据点,我的系统矩阵 G 也很大,但只有一维(因为我的数据点比模型参数多得多)。在 6 个模型参数的情况下,G 的大小为 (10⁷ × 6)。因此,W 的大小必须为 (10⁷ × 10⁷)。但是,它是稀疏的,只有 107 个非零条目(权重)。
为了减少内存,我在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)。
【问题讨论】:
-
d1和d2是什么?请发布可运行的代码。另外,d = [d1;d2]意味着w1和w2只是一个,W是eye?为什么要两个对角线赋值(最后两行)? -
d = [d1;d2] 是 nx 1 和 mx 1 向量的垂直串联,因此除了 length(d1)+length(d2) 之外不暗示 d1 和 d2 的长度= 长度(d)
-
您是否尝试过使用
W = sparse([1:numel(d1) 1:numel(d2)], 1:numel(d), [w1; w2], numel(d), numel(d));,其中w1和w2是列向量?这替换了初始化W = sparse(length(d),length(d));和两个赋值行 -
@LuisMendo:太好了,我没有意识到稀疏矩阵的这种初始化是可能的。它实际上甚至在纪录片中给出。它快了几个数量级。非常感谢!
-
如果
W是真正的对角线,那么你最好用bsxfun(@times, G, [length(d2) length(d1)]/length(d))来计算G.' · W.'。WG和Wd是什么?
标签: performance matlab math matrix matrix-inverse