
前々回からneldermead_で始まる「関数群」のデモを舐めてます。不埒な素人老人には有難みがイマイチっす。しかし、今回のデモなど見ているとようやくneldermead_「関数群」がそのお力を発揮する片鱗を見せているのではないかと。でもま、素人にはムツカシー。でも生成AI殿は例によってなんでもご存じ。やっぱり?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0を使用させていただいております。(Scilabについては御本家 Scilab 様へ)
前回もNelderMead法使うのならば、fminsearch関数で十分でないの的な不埒なことを書いてしまいました。でもま、わざわざneldermead_「関数群」を使う意義もあるみたいです。今回のデモではその意義を明らかにすべく遂にターゲット関数は「いつものバナナ関数」を離れました。バナナ関数だと独立変数2次元だからなのかな。今回はいろいろ次元を変化させたときのNelderMead法の向き不向きをデモするためみたい。
neldermead_dimension.sce
先にGoogleの生成AI、Gemini様に教わった今回デモの眼目というべき、NelderMead法の向き不向きの話を掲げておきます。
今までデモに使ってきたバナナ関数のような低次元の最適化では優秀だけれども、次元が増すと「次元の呪い」的な効果がのさばってきてヨレヨレになってしまうみたい。
gemini様がお教えくださっている向き不向きのリストが以下に。
今回のデモでは、以下のようなターゲット関数(スカラ的な入力変数の数は可変)をターゲットに次元によるアルゴリズムの挙動の違いをみるもの。
実行結果
1次元から20次元まで、Nelder-Mead法を適用して、評価回数、反復回数、収束率を求めたもの。収束率をグラフにしたものが以下に。
1、2くらいはよい感じだけれども、3超えるとダメダメになり、5超えたらあとは皆一緒的な?
真っすぐ一本線かと思いきや、10超えるとなんかヨレヨレになってないかい?
neldermead_「関数群」使うと、こういうグラフを描けることも分かったけれど、素人老人はやらんな(ムツカシーので使えんな。)最初から他のところをあたるよ、多分。



