我是优化方面的初学者,欢迎该领域的任何指导。
我有 15 个矩阵(即大小为 (n*m)
的 Di
),想要找到最佳权重(即 wi
)对它们进行加权平均,并生成一个与给定矩阵(即 Dt
)更相似的更好的矩阵。
事实上我的目标函数是这样的:
min [norm2(sum(wi * Di) - Dt) + norm2(W)]
for i=1 ... 15 s.t. sum(wi) = 1 , wi >= 0
如何在 Matlab 中优化此函数?
最佳答案
您正在描述一个简单的 Quadratic programming ,可以使用 Matlab 的 quadprog
轻松优化.
事情是这样的:
您的目标函数是[norm2(sum(wi * Di) - Dt) +norm2(W)]
,受到w
的一些线性约束。让我们使用一些简化的符号来重写它。令 w
为未知数的 15×1 向量。令 D
为一个 n*m
×15 矩阵(每一列都是您拥有的 Di
矩阵之一 - 写为单列),而 Dt
是一个 n*m
×1 向量(与 Dt
相同,但写为列向量)。现在一些线性代数(使用 ||x||^2 = x'*x 以及 argmin x 等于 argmin x^2 的事实)
[norm2(sum(wi * Di) - Dt)^2 + norm2(W)^2] =
(D*w-Dt)'*(D*w-Dt) + w'*w =
w'D'Dw - 2w'D'Dt + Dt'Dt + w'w =
w'(D'D+I)w - 2w'D'Dt + Dt'Dt
最后一项Dt'Dt
是常数w.r.t w
,因此可以在最小化过程中被丢弃,留下
H = 2*(D'*D+eye(15));
f = -2*Dt'*D;
至于约束sum(w)=1
,这可以很容易地定义为
Aeq = ones(1,15);
beq = 1;
下限lb = Zeros(15,1)
将确保所有w_i>=0
。
二次优化:
w = quadprog( H, f, [], [], Aeq, beq, lb );
应该可以帮到你!
关于matlab - 矩阵加权和优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29600731/