手習ひデジタル信号処理(213) Scilab、{Scilabデモ}、目出度いバナナ関数

Joseph Halfmoon

年が明けてもバナナ関数の最適化デモはつづきます。これは目出度い。今回はネルダーミード法を駆使するfminsearch関数のOutputFcnなるものを利用してます。ぶっちゃけ最適化の各ステップ毎に情報を開示するための出力関数です。1歩1歩最適解へ近づく様子が見えるのだと、ホントか?

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0を使用させていただいております。(Scilabについては御本家 Scilab 様へ)

fminsearch_outputfunction.sce

今回「鑑賞」させていただくScilabのデモは、fminsearch_outputfunction.sce です。以下のデモ選択画面から起動できます。selectOutputFunc

今回も最適化(最小値を求める)ターゲットは、バナナ関数(Rosenbrock関数)デス。前回に引き続きfminsearch関数(ネルダーミード法)のオプションを使ってみるの回です。今回使用のデモコードの一部を引用させていただくとこんな感じ。outputFunc

赤枠部分が、毎度お馴染みバナナ関数です。今回のテーマは緑枠の部分 outfun 関数です。こいつを青枠のようにして指定してfminsearch関数に渡してやると、毎度の繰り返し毎に outfun を呼び出してくれるみたい。すると「シンプレックス」が最適解に向かって「這いよる」様子が明らかになると。

デモ結果

実行結果の冒頭部分が以下に。outputFunc0EC

最適化のステップ毎に「どんな処理をしているのか」が明らかになってます。以前の回でネルダーミード法の各ステップには以下のようなステップがあることをGoogleの生成AI、Gemini様に教わってます。

    1. reflection、反射
    2. expansion、膨張
    3. contraction、収縮
    4. shrink、縮小

上記の結果では、1から3までが出現してます。特に3は insideとoutsideに分類されとります。収縮にも外側(outside、新たな点は鏡映点と重心の中間)と内側(inside、新たな点は最悪点と重心の中間)があるみたい。

今回は以下のように、shrinkのステップを通ることなく、前回やったTolXを達成してしまったみたいです。outputFunc1

どうも、ネルダーミード法における shrink は、シンプレックスが解に近付いてしまった場合に用いられる「最終兵器」みたいっす。今回は shrink にお出まし願うまでもなく最適解が求まってしまったみたい。

ともあれ、シンプレックスが「這いよる」様子が分かって嬉しい。 ホントか?

手習ひデジタル信号処理(212) Scilab、{Scilabデモ}、これでもかとバナナ関数 へ戻る

手習ひデジタル信号処理(214) Scilab、{Scilabデモ}、早く言ってよバナナ関数 へ進む