通过更改变量来最小化目标函数 - 在Matlab中?

时间:2011-04-22 23:43:52

标签: matlab mathematical-optimization nonlinear-optimization

我有一个名为101x82的{​​{1}}大小矩阵。使用这个变量矩阵,我计算了另外两个变量:

1)AB标量和

2)1x1C矩阵。

我将50x61)与其模拟变量2)3)进行比较,其值已修复:

3)4)D标量和

4)1x1E矩阵。

现在,我想扰乱/更改50x6矩阵的值,以便:

A1),即3)几乎等于B

D2),即4)几乎等于C

请注意,在扰乱E时,AB会发生变化,但不会发生CD

任何想法如何做到这一点?谢谢!

2 个答案:

答案 0 :(得分:1)

我无法运行你的代码,因为它要求加载数据(我没有),而且如何计算B或C并不是很明显。

幸运的是,我可以回答你的问题。您正在描述优化问题,解决方案是使用fminsearch(或其他类似的东西)。

您要做的是定义一个返回带有两个元素的向量的函数:

y1 = (B - D)^weight1;
y2 = norm((C - E), weight2);

重量是你允许变化的强度(重量= 2通常就足够了) 你的函数变量是A。

答案 1 :(得分:0)

根据我的理解,你有一些功能。

fb(A)= B

fc(A)= C

你知道上面列出的函数吗?你知道从A到这些函数的映射吗? 如果你想尝试优化,以便B接近D,你需要选择:

  1. 接近意味着什么。你可以看一下B和D情形的一些向量范数,比如最小化|| B-D || ^ 2。这种不同元素的平方的标准总和可能会成功,并且在计算上很好。
  2. 如何优化。这很大程度上取决于你的功能,无论你想要本地还是全球的mimina等等。
  3. 基本上,现在我们把问题归结为最小化:

    成本= || fb(A) - fd(A)|| ^ 2

    您当然可以做的一件事是根据A的各个元素计算此成本函数的梯度,然后使用具有适当“时间步长”的前向欧拉方法执行最小化步骤。这可能不会很快,但是如果时间步长足够小且功能足够好,它至少会让你达到局部最小值。

    计算此

    的渐变

    grad_A(cost)= 2 * || fb(A)-fd(A)|| *(grad_A(fb)(A)-grad_A(fd)(A))

    其中grad_A表示相对于A的梯度,而grad_A(fb)(A)表示相对于在A处评估的函数fb的A的梯度等。

    计算grad_A(fb)(A)取决于fb的形式,但这里有一些页面有“矩阵演算”的身份和解释。

    Matrix calculus identities Matrix calculus explanation

    然后你只需通过前进欧拉更新在A上执行梯度下降:

    A_next = A_prev - timestep * grad_A(cost)