matlab - 最小化具有大向量变量的函数的最佳方法?

标签 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."

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

最佳答案

这里使用 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/

相关文章:

image - MATLAB M x N x 24 数组到位图

matlab - Simulink 中的 block 积分器溢出

julia - 如何使用 JuMP 寻求 MIP 的第二最佳解决方案

c# - Math.Log 与几何平均数的乘法复杂度哪个更好?

matlab - 在 Matlab 中使用 imfinfo 函数进行图像压缩

java - 使用 Matlab Builder JA 时遇到的问题

matlab - Matlab 中的多行匿名函数?

JavaScript 误算和 $NaN

PyTorch:在这个简单的例子中,为什么损失不变?

python - 在不显式定义梯度的情况下优化 scipy 中的函数