2

我试图最小化一个函数,它是一个 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."

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

4

2 回答 2

3

在这里使用 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 在任何合理的时间内都无法收敛。您当然可以更改限制,但最好是使用正确的工具开始。

于 2012-08-21T23:45:20.107 回答
2

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

weights_correct = fminsearch(@Moo, weights_vector, optimset('MaxFunEvals', num);

num您指定的数字在哪里。默认值为200*numberOfVariables.

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

于 2012-08-21T22:50:34.017 回答