我正在尝试最小化作为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."
这让我相信我没有正确地最小化。发生了什么事?
答案 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个变量似乎要求优化例程。