【问题标题】:Octave fminsearch: Problems with minimization and optionsOctave fminsearch:最小化和选项的问题
【发布时间】:2012-10-22 20:42:57
【问题描述】:

我正在尝试使用 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)
    

    产生错误:

    错误:options(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 列

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

    错误:在第 4 行第 3 列附近未定义“x”
    错误:调用自:
    错误:/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 找不到解决办法?

【问题讨论】:

标签: matlab octave


【解决方案1】:

octave-forge 包“optim”中有一个 fminsearch 实现。 您可以在其实现文件中看到,第三个参数始终是选项向量,第四个始终是 grad 向量,因此您的 ,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] 让它使用常规单纯形而不是“直角单纯形”。如果您的系数在尺度上有很大差异,则默认八度音程毫无意义。

【讨论】:

    【解决方案2】:

    优化函数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
    

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2011-04-06
      • 1970-01-01
      • 2014-08-07
      • 2023-03-17
      相关资源
      最近更新 更多