Octave fminsearch:最小化和选项的问题

时间:2012-10-22 20:42:57

标签: matlab octave

我正在尝试使用Octave的fminsearch函数,我以前在MATLAB中使用过它。该函数似乎没有充分记录(至少对我来说),我不知道如何设置选项,以实际上最小化。

我尝试使用此消息末尾的代码拟合一个非常简单的指数函数。我想要以下内容:
我希望函数将x和y值作为输入,就像MATLAB一样。此外,我想要对选项进行一些控制,以确保它实际上最小化(即最小化!) 当然,最后我想要拟合比指数更复杂的函数,但我希望能够至少适应指数。

我对fminsearch有几个问题:

  1. 我尝试将x和y值移交给函数,但是像这样的matlab风格的东西:

    [xx,fval]=fminsearch(@exponential,[1000 1],x,y);
    

    [xx,fval]=fminsearch(@exponential,[33000 1],options,x,y)
    

    产生错误:

      

    错误:选项(6)与已知算法不对应   错误:来自:   错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m第72行,第16栏   错误:/opt/local/share/octave/packages/optim-1.0.6/fminsearch.m第29行,第4栏

    或者分别(对于上面的第二种情况):

      

    错误:'x'未定义在第4行第3列附近   错误:来自:   错误:/Users/paul/exponential.m在第4行第2列   错误:/opt/local/share/octave/packages/optim-1.0.6/nmsmax.m,第63行,第6列
      错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m第77行第9列   错误:/opt/local/share/octave/packages/optim-1.0.6/fminsearch.m第29行,第4栏

    显然,fminsearch所采用的参数顺序与MATLAB中的参数顺序不同。那么,这个命令怎么样? 如何让fminsearch获取值和选项?

  2. 我找到了一个问题,解决了该函数不会取值的问题:我将x和y值定义为全局值。不优雅,但至少在功能中可以使用这些值 尽管如此,fminsearch并未恰当地最小化 如下所示:

    这是功能:

    function f=exponential(coeff)
    global x
    global y
    X=x;
    Y=y;
    a= coeff(1);
    b= coeff(2);
    Y_fun = a .* exp(-X.*b);
    DIFF = Y_fun - Y; 
    SQ_DIFF = DIFF.^2;
    
    f=sum(SQ_DIFF);
    end
    

    以下是代码:

    global x
    global y
    x=[0:1:200];
    y=4930*exp(-0.0454*x);
    options(10)=10000000;
    [cc,fval]=fminsearch(@exponential,[5000 0.01])
    

    这是输出:

      

    cc =

         

    4930.0 5184.6

         

    fval = 2.5571e + 08

    为什么fminsearch找不到解决方案?

2 个答案:

答案 0 :(得分:1)

无论选项是什么,优化函数fminsearch都将始终尝试找到最小值。因此,如果您发现它没有找到最小值,那是因为它没有这样做。

从您提供的代码中,我无法确定出现了什么问题。使用全局变量的解决方案应该可以工作,而确实在这里工作,所以你身边的其他东西必须出错。 (注意:我使用MATLAB,而不是Octave,所以这两个函数可能会略有不同......)

无论如何,为什么不这样做呢?

function f = exponential(coeff)

    x = 0:1:200;
    y = 4930*exp(-0.0454*x);

    a = coeff(1);
    b = coeff(2);

    Y_fun = a .* exp(-x.*b);     

    f = sum((Y_fun-y).^2);
end

或者,如果您必须将xy作为外部参数传递,

x = [0:1:200];
y = 4930*exp(-0.0454*x);
[cc,fval] = fminsearch(@(c)exponential(c,x,y),[5000 0.01])


function f = exponential(coeff,x,y)

    a = coeff(1);
    b = coeff(2);

    Y_fun = a .* exp(-x.*b);     

    f = sum((Y_fun-y).^2);

end

答案 1 :(得分:1)

octave-forge包“optim”中有一个fminsearch实现。 您可以在其实现文件中看到第三个参数始终是一个选项向量,第四个参数始终是一个渐变向量,因此您的x,y调用将不起作用。

您还可以在实现中看到它调用fmins实现。

该fmins实施的文档说明:

         if options(6)==0 && options(5)==0 - regular simplex
         if options(6)==0 && options(5)==1 - right-angled simplex
            Comment: the default is set to "right-angled simplex".
              this works better for me on a broad range of problems,
              although the default in nmsmax is "regular simplex"

最近我的一个问题可以通过matlab的fminsearch解决,但不能用这个octave-forge实现。我不得不指定一个选项向量[0 1e-3 0 0 0 0]让它使用常规单纯形而不是“直角单形”。如果你的系数在规模上有很大差异,那么八度默认是没有意义的。