我正在尝试最小化作为 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 是愚蠢的。多次调用 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 会传入这些数组的值。
最后,最大函数评估的问题是您正在做的事情的症状。对于 fminsearch 来说,25 个变量对于期望在任何合理的时间内收敛来说太多了。当然,您可以更改限制,但更好的是一开始就使用正确的工具。
关于matlab - 最小化具有大向量变量的函数的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064018/