手習ひデジタル信号処理(220) Scilab、{Scilabデモ}、シンプレックスと次元

Joseph Halfmoon

前々回からneldermead_で始まる「関数群」のデモを舐めてます。不埒な素人老人には有難みがイマイチっす。しかし、今回のデモなど見ているとようやくneldermead_「関数群」がそのお力を発揮する片鱗を見せているのではないかと。でもま、素人にはムツカシー。でも生成AI殿は例によってなんでもご存じ。やっぱり?

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

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

前回もNelderMead法使うのならば、fminsearch関数で十分でないの的な不埒なことを書いてしまいました。でもま、わざわざneldermead_「関数群」を使う意義もあるみたいです。今回のデモではその意義を明らかにすべく遂にターゲット関数は「いつものバナナ関数」を離れました。バナナ関数だと独立変数2次元だからなのかな。今回はいろいろ次元を変化させたときのNelderMead法の向き不向きをデモするためみたい。

neldermead_dimension.sce

今回のデモは、以下のデモ選択画面から起動できます。selectDimension

先にGoogleの生成AI、Gemini様に教わった今回デモの眼目というべき、NelderMead法の向き不向きの話を掲げておきます。geminiDim00

今までデモに使ってきたバナナ関数のような低次元の最適化では優秀だけれども、次元が増すと「次元の呪い」的な効果がのさばってきてヨレヨレになってしまうみたい。

gemini様がお教えくださっている向き不向きのリストが以下に。geminiDim01

今回のデモでは、以下のようなターゲット関数(スカラ的な入力変数の数は可変)をターゲットに次元によるアルゴリズムの挙動の違いをみるもの。DimensionSRC

実行結果

デモの実行結果が以下に。DimensionResult

1次元から20次元まで、Nelder-Mead法を適用して、評価回数、反復回数、収束率を求めたもの。収束率をグラフにしたものが以下に。DimensionDim

1、2くらいはよい感じだけれども、3超えるとダメダメになり、5超えたらあとは皆一緒的な?

一方、繰り返し回数のグラフが以下に。DimensionIter

真っすぐ一本線かと思いきや、10超えるとなんかヨレヨレになってないかい?

neldermead_「関数群」使うと、こういうグラフを描けることも分かったけれど、素人老人はやらんな(ムツカシーので使えんな。)最初から他のところをあたるよ、多分。

手習ひデジタル信号処理(219) Scilab、{Scilabデモ}、こちらにも出力関数あり へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です