使用大型矢量变量最小化函数的最佳方法是什么?

时间:2012-08-21 22:33:00

标签: matlab mathematical-optimization

我正在尝试最小化作为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."

这让我相信我没有正确地最小化。发生了什么事?

2 个答案:

答案 0 :(得分:3)

这里使用evalin很愚蠢。多次调用evalin无济于事。如果您努力学习将evalin用于错误的目的,那么请努力学习如何使用函数句柄。

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

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

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

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

答案 1 :(得分:2)

您超出了默认的功能评估数。您可以使用

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

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

我当然不是专家,拜托,有人纠正我,但25个变量似乎要求优化例程。

相关问题