【问题标题】:efficient algorithm to find minimum of multivariable function寻找多变量函数最小值的有效算法
【发布时间】:2014-12-01 04:33:31
【问题描述】:

我有一个希望最小化的多变量函数。该函数有两个输入参数,一个向量 c 和一个标量 \theta。

在 MATLAB 中使用 fmincon 解决 c 和 \theta 的优化问题很复杂,因为 \theta 的某些值会导致数值错误。但是,修正theta,c可以通过fmincon轻松获得,没有任何错误。

所以现在的计划是使用蛮力方法,即计算 1:100 范围内的 \theta 的每个值的 c(尽管 \theta 的真正约束是 \theta \ge 0)并选择 \theta (以及相应的 c),通过将估计的参数插入目标函数,目标值最小化。

现在这对我来说听起来不是很有效,我想知道我是否可以采用二等分方法,这样我就不必在上面指定的范围内检查 \theta 的所有可能值。

非常感谢!

【问题讨论】:

    标签: matlab optimization fminsearch


    【解决方案1】:

    您应该可以让 fmincon 在 ctheta 上为您工作。如果在包含 theta 时无法获得不错的结果,可能是因为 ctheta 中的元素具有非常不同的比例。你应该缩放你的方程,使所有的变量最终都在 1.0 左右。这极大地提高了几乎所有数值优化代码的性能(即速度)和准确性。

    因此,如果您怀疑 c 的最终值可能最终为 [1.0 0.001 10.0] 并且您怀疑 theta 可能最终为 [10.0],您可以将问题表述为

    >>>>>>>>>>>>>>>>>>>>> in your main program prior to invoking fmincon
    c = [1.0 0.001 10.0]
    theta = 10.0
    foo_x = [c(:);thetha];
    scale_fac = [1.0 1000.0 0.1 0.1];
    x = foo_x .* scale_fac;  %scale your seed values to be near 1.0
    
    >>>>>>>>>>>>>> inside your function
    function err = myfunction(x,scale_fac)
    foo_x = x ./ scale_fac;  %de-scale to get back to correct magnitude
    c = foo_x(1:3);
    theta = foo_x (4);
    
    ...rest of your code
    

    【讨论】:

    • 嗨chipaudette,我明白你的意思,但恐怕我的目标函数比这更复杂。我的目标函数是多元正态分布,我所指的 \theta 是一个相关参数。因此,它出现在协方差的行列式以及逆协方差矩阵中。根据 theta 的初始值,目标函数必须处理几乎奇异的矩阵,从而产生错误......
    • 您可以在 fmincon 中执行 fmincon。因此,在顶层,您将让它搜索 theta(您将要进行暴力破解的变量)。在里面,你现在得到了 theta,你可以让你的函数再次调用 fmincon,这一次求解 c。由于 fmincon 会做一些比蛮力搜索更聪明的事情,它可能会更有效。
    【解决方案2】:

    只有当目标函数在 theta 中是凸的(或拟凸的)时,对 theta 的二分搜索才有效。否则,您可能会发现本地最小值而不是全局最小值。

    正如@chipaudette 所建议的那样,如果您选择能够解决非凸优化问题的求解器,则应该可以进行嵌套 fmincon。 (关于这个主题的MATLAB help 有点模糊,但我认为 SQP 求解器应该没问题。)但我怀疑仅枚举相关的 theta 范围会更有效,而不是使用 fmincon。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2012-09-03
      • 2019-11-05
      • 2021-12-13
      • 2015-08-26
      • 2019-06-08
      相关资源
      最近更新 更多