2

我是优化的初学者,欢迎该领域的任何指导。

我有 15 个矩阵(即Di大小为(n*m)),并希望找到最佳权重(即)wi以对它们进行加权平均,并制作一个更类似于给定矩阵(即Dt

事实上我的目标函数是这样的:

min [norm2(sum(wi * Di) - Dt) + norm2(W)]
for i=1 ... 15    s.t. sum(wi) = 1 , wi >= 0

如何在 Matlab 中优化此功能?

4

1 回答 1

2

您正在描述一个简单的二次规划,可以使用 Matlab 轻松优化quadprog

这是怎么回事:

你的目标函数[norm2(sum(wi * Di) - Dt) + norm2(W)]受到一些线性约束w。让我们用一些简化的符号重写它。设w为 15×1 的未知向量。让我们D成为一个n*m-by-15 矩阵(每列是Di您拥有的矩阵之一 - 写为单列),并且Dt是一个n*m-by-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是恒定的 wrt 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 );

应该为您解决问题!

于 2015-04-13T08:58:19.847 回答