2

以前に MATLAB で使用した Octave の fminsearch 関数を使用しようとしています。この関数は (少なくとも私にとっては) 十分に文書化されていないようで、実際に最小化するようにオプションを設定する方法がわかりません。

このメッセージの最後にあるコードを使用して、非常に単純な指数関数を当てはめてみました。次のことが必要です:
MATLAB と同じように、関数が x 値と y 値を入力として受け取るようにします。さらに、オプションをある程度制御して、実際に最小化するようにします (つまり、最小化します!)。
もちろん、最終的には指数関数よりも複雑な関数を当てはめたいと思っていますが、少なくとも指数関数を当てはめたいと思っています。

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 列目

    または、それぞれ (上記の 2 番目のケースの場合):

    エラー: 行 4 列 3 付近で「x」が未定義
    エラー: 呼び出し元:
    エラー: 行 4、列 2 の
    /Users/paul/exponential.m エラー: /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解決策が見つからないのですか?

4

2 に答える 2

1

octave-forge パッケージ "optim" には fminsearch の実装があります。実装ファイルを見ると、3 番目のパラメータは常にオプション ベクトルであり、4 番目のパラメータは常に勾配ベクトルであるため、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] を指定する必要がありました。係数のスケールが大きく異なる場合、オクターブのデフォルトは意味がありません。

于 2013-06-04T09:55:00.953 に答える
1

最適化関数fminsearchは、オプションが何であれ、常に最小値を見つけようとします。したがって、最小値が見つからない場合は、それが失敗したためです。

あなたが提供したコードから、何が問題なのか判断できません。グローバルを使用したソリューションは機能するはずであり、実際にここでも機能するため、他の何かがうまくいかないはずです(注: 私は Octave ではなく MATLAB を使用しているため、これら 2 つの関数は若干異なる可能性があります...)

とにかく、このようにしないのはなぜですか?

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

xまたは、 andyを外部パラメータとして渡す必要がある場合は、

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-10-23T04:17:40.107 に答える