【问题标题】:Best way to minimize a function with a large vector variable?最小化具有大向量变量的函数的最佳方法?
【发布时间】:2012-08-22 10:07:40
【问题描述】:

我正在尝试最小化作为 1x25 向量 (weights_vector) 函数的函数。换句话说,我试图在向量中找到使函数最小化的值。

函数定义为:

    function weights_correct = Moo(weights_vector)

    corr_matrix = evalin('base', 'corr_matrix');
    tolerance = evalin('base', 'tolerance');
    returns = evalin('base', 'returns');

    weights_correct = weights_vector'*corr_matrix*weights_vector - tolerance*returns'*weights_vector; 

    end       

在这个函数上,我正在调用:

    weights_correct = fminsearch(@Moo, weights_vector);

这会重复直到我看到错误

    "Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option."

这让我相信我没有正确地最小化。怎么回事?

【问题讨论】:

  • 为什么以上帝和小青苹果的名义使用 evalin 将变量带入函数?这将是非常低效的,而且没有充分的理由。了解如何使用匿名函数,您将获得巨大的收益。
  • 我知道这不是最佳做法,但您对解决此问题的适当最小化函数有什么建议吗?
  • 你能把weight_vectortolerancecorr_matrixreturns的内容贴出来吗?然后我可以玩得更好一点......

标签: matlab mathematical-optimization


【解决方案1】:

这里使用 evalin 是愚蠢的。多次调用 evalin 将无缘无故地低效。如果您将努力学习将 evalin 用于错误的目的,那么请努力学习如何使用函数句柄。

您甚至不需要定义 m 文件,尽管您可以这样做。一个简单的函数句柄就足够了。

Moo = @(w_v) w_v'*corr_matrix*w_v-tolerance*returns'*w_v;

然后调用更好的优化器。在 25 个变量的问题上使用 fminsearch 是很疯狂的。如果您会进行大量优化,那么优化工具箱是值得投资的。

weights_correct = fminunc(@Moo, weights_vector);

或者,您可以在一行中完成所有操作。

weights_correct = fminunc(@(w_v) w_v'*corr_matrix*w_v-tolerance*returns'*w_v, weights_vector);

请注意,当您在此处创建函数句柄时,MATLAB 会传入这些数组的值。

最后,max function evals 的问题是你正在做的事情的症状。 25 个变量对于 fminsearch 在任何合理的时间内都无法收敛。您当然可以更改限制,但最好是使用正确的工具开始。

【讨论】:

  • 谢谢,这很有帮助。但是,当我从 fminsearch 切换到 fminunc 时,我现在收到错误 fminunc stopped because it cannot decrease the objective function along the current search direction.Local minimum possible. 它返回的可能解决方案仅从默认位置更改了几个权重,而 fminsearch 更改了所有权重。为什么他们有如此不同的解决方案?
  • 您没有向我们/我提供有关公差值和返回向量的任何信息。我假设 corr_matrix 是一个相关矩阵,但看起来可能很奇怪。在对此类随机问题进行的一些快速测试中,fminunc 快速收敛到一个可靠的解决方案,并且在 fminsearch 由于函数评估不足而失败所需的一小部分时间内。更糟糕的是,即使我允许 fminsearch 运行更长时间,它仍然不会产生 fminunc 的准确性,除非我让它运行很长时间。所以要么看参数,要么帮助我们。
【解决方案2】:

您超出了默认的函数评估次数。您可以使用

进行更改
weights_correct = fminsearch(@Moo, weights_vector, optimset('MaxFunEvals', num);

其中num 是您指定的某个数字。默认为200*numberOfVariables

我当然不是专家,请有人纠正我,但是 25 个变量对于优化例程来说似乎很多。

【讨论】:

  • 不,对于许多优化器来说,25 个变量并不多。对于 fminsearch 来说,这几乎是不可能的,很疯狂。
  • 谢谢木片。像粒子游这样的东西更适合高维数据,对吧?
  • 粒子群是一种选择,一种随机优化器。与所有随机优化器一样,它们具有好的和坏的属性。如果您希望获得多位数的准确结果,则 fminunc 之类的优化 TB 工具会更好。但是,如果有许多本地解决方案,PSO 可能会帮助您收敛到(可能)全局解决方案。当然不能保证。 PSO 也可能对导致 fminunc 死亡的目标问题(例如可微分性)具有鲁棒性。任何这样的优化器都只能与您的起始值一样好,所以开始太远了,你应该期待糟糕的结果.
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2015-08-26
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多