matlab - 矩阵加权和优化

标签 matlab optimization mathematical-optimization quadratic-programming

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

我有 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/

相关文章:

matlab - Julia:找到两个向量及其索引的交集以帮助连接两个时间序列

optimization - Swift 泛型能否帮助函数根据类以不同方式处理参数?

java - Java中单变量非线性函数的最小查找

matlab - FOR 遍历列向量与行向量

matlab - 为什么 OpenCV RGB 到 YCbCr 转换的结果与使用 ycbcr2rgb 函数在 matlab 中转换的结果不同?

django - Django 更新或创建的性能优化

python - 需要提高 fsolve 的准确性以找到倍数根

algorithm - 圣经快速约会(匹配/安排/优化)

matlab - 整数因式分解

c - 如何向 gcc 提供有关循环计数的提示