« ミクロ経済学の我流シミュレーション その3 log 戦略 | トップページ | 資産市場の簡易シミュレーション »

2019年5月24日 (金)

ミクロ経済学の我流シミュレーション その4 最適化の失敗

概要


これまでも最適化関数が失敗(fail)を返すことはあった。今回はそのことではなく、最適化が成功したとしても、それが本当に全体として最適最良のものになっているかを問う。結論としては、そうなってなかったが、大きな問題ではないと私は考える。
実験


micro_economy_5.py を元に実験する。最適化にはこれまで Nelder-Mead 法を使ってきた。Nelder-Mead 法は初期値を必要として、そこから「アメーバ」のように動いて最適値を探り出す方法と言われる。

初期値にはこれまで、直近の最適化で得られた価格情報を(環境が変わる次の回でも)渡していた。

それを、直近も含め過去のデータすべての中で一番スコアが良いものを初期値とすることを試してみる。そうしてから初期値を選び最適値を得たものと、これまで通り直近のものを初期値として選び最適値を得たものの二者の中で良いほうを結果として受け容れることにする。

そうしたものが exp_01_06.py (数値が 1-6 からはじまるのはそれ以外の実験を他に私的には行っているから。)である。その実行結果は次のようになる。

$ python exp_01_06.py
Acronyms: W: Wages, N: Necessaries, L: Luxuries, I: Ingredients.

OptForStep: iterated 200 times score=-0.22109930631128658
Companies N:2, L:2, I:2
[Type] [OwnerId] [ProfitRate]
N 1 0.34031978914966
N 2 0.22217046351487754
L 1 -0.0028149279337999684
L 1 0.06520801294283221
I 0 0.2824687838054689
I 2 0.24272845926872333

Score -0.22109930631128658 vs -0.22109930631128658
Increase of Social Debt: -16556.05650042524
Increase of Total Savings: -1345.3207072601544
Price W:25.19634074497627, N:9.83125002484438, L:16.006028640964608, I:15.948455079173653
Worker's Savings Increase: 5.3347579115945685
Supply of Labors = 657
(Demand - Supply) of Labors = -0.24971326478521405
Profit Rate N:0.34031978914966, L:0.06520801294283221, I:0.2824687838054689
Product N:2030.3512470037679, L:289.0, I:1329.297412974788
Savings mean:8.691460568853538, variance:37.207520536597116

:
:(途中省略)
:

OptForStep: iterated 153 times score=-0.2593138141848632
Companies N:7, L:6, I:6
[Type] [OwnerId] [ProfitRate]
N 1 0.2747278977332604
N 2 0.21138034912609832
N 3 0.23459753270847028
N 1 0.2693049233500547
N 3 0.2946833927871138
N 1 0.3316038641762035
N 0 0.22797953099094675
L 1 0.2666985290367451
L 3 0.30970641180107616
L 1 0.3428670146639742
L 2 0.26821562503211716
L 1 0.31257002327163136
L 4 0.21041516397626298
I 2 0.15590041629842527
I 4 0.08507144818545924
I 1 0.12304717500370566
I 4 0.04492497557033961
I 1 0.0807545128442661
I 3 0.09932622085271332

Score -0.2593138141848632 vs -0.25329423686151115
Increase of Social Debt: -16349.315158567348
Increase of Total Savings: 38.13528744313044
Price W:25.366061894534468, N:9.078691228352632, L:18.591647606103592, I:14.253770379788111
Worker's Savings Increase: 6.196911185913805
Supply of Labors = 663
(Demand - Supply) of Labors = -0.04818838454480101
Profit Rate N:0.3316038641762035, L:0.3428670146639742, I:0.15590041629842527
Product N:2122.0015063404117, L:219.0, I:1582.73660071398
Savings mean:8.610848405403493, variance:36.75617888154675

:
:(途中省略)
:

OptForStep: iterated 135 times score=-0.26223714004105286
Companies N:8, L:7, I:7
[Type] [OwnerId] [ProfitRate]
N 1 0.29244396712184145
N 2 0.23566608446312087
N 3 0.2593502229886645
N 1 0.294076625706582
N 3 0.32070440760596003
N 1 0.3577983350417849
N 0 0.2528094441634307
N 1 0.28655501693400803
L 1 0.256128639613569
L 3 0.3005402456307164
L 1 0.33232295285681723
L 2 0.2602145395353427
L 1 0.3024347324452003
L 4 0.20259364440895364
L 1 0.23119649304309295
I 2 0.15813075508962302
I 4 0.08722674093523698
I 1 0.1245850476434361
I 4 0.04679740182223427
I 1 0.08219542336210783
I 3 0.10112683282664274
I 1 0.13853618068829995

Score -0.26223714004105286 vs -0.255215643281806
Increase of Social Debt: -14475.106770311046
Increase of Total Savings: -516.485131217235
Price W:25.51490913416877, N:9.345638724259391, L:18.624829618030073, I:14.393997769293929
Worker's Savings Increase: 6.130244478898561
Supply of Labors = 664
(Demand - Supply) of Labors = -0.001307116232737826
Profit Rate N:0.3577983350417849, L:0.33232295285681723, I:0.15813075508962302
Product N:2084.5646352641784, L:247.0, I:1606.6156841634006
Savings mean:8.114132625035046, variance:23.675034764129972

:
:(途中省略)
:

OptForStep: iterated 167 times score=-0.2560672662065596
Companies N:11, L:11, I:9
[Type] [OwnerId] [ProfitRate]
N 3 0.3640884287024172
N 1 0.3946057950615205
N 3 0.4322948896683518
N 1 0.46682642686984094
N 0 0.367835812424522
N 1 0.39669951427370914
N 2 0.2640438213473595
N 3 0.29072550684964266
N 2 0.14813175873515116
N 3 0.17343654406118805
N 0 0.1938152752830297
L 3 0.33051419997034476
L 1 0.3320902869361515
L 2 0.30587979100695467
L 1 0.32422862694991267
L 4 0.26864783685305454
L 1 0.2656002474718675
L 2 0.1920078240597659
L 1 0.2208767673195521
L 0 0.19143950648297225
L 1 0.21574723260818923
L 2 0.10851988484292231
I 4 0.031161567629689052
I 1 0.06388648796920383
I 4 -0.002341381853045759
I 1 0.02958560932021403
I 3 0.04887358910124645
I 1 0.08388912418317676
I 0 0.03657719650007993
I 1 0.07058542580218657
I 3 0.09042968980867483

Score -0.2559778603714225 vs -0.2560672662065596
Increase of Social Debt: -9920.299195863583
Increase of Total Savings: 541.3437302681468
Price W:25.96611076893603, N:9.745238991899008, L:19.113359823855383, I:13.329027833003991
Worker's Savings Increase: 6.304695332917202
Supply of Labors = 671
(Demand - Supply) of Labors = -0.09835948907266356
Profit Rate N:0.46682642686984094, L:0.3320902869361515, I:0.09042968980867483
Product N:2027.6283146698324, L:200.99999999999997, I:1937.1168475570857
Savings mean:8.85893961585377, variance:33.969556961201334

:
:(途中省略)
:

OptForStep: iterated 158 times score=-0.2433030119521747
Companies N:11, L:11, I:9
[Type] [OwnerId] [ProfitRate]
N 2 0.1600320191309793
N 3 0.18228690986983306
N 0 0.20277166573081373
N 3 0.22667364416543498
N 1 0.2511043715230468
N 0 0.21061450833284473
N 1 0.2364013846467154
N 2 0.09921515655925044
N 1 0.1260993407149877
N 3 0.1536828247229325
N 1 0.178729562741382
L 0 0.3887094633547608
L 1 0.353971109048702
L 2 0.31760689540810577
L 3 0.35058949736999684
L 4 0.23238375825999893
L 3 0.24009847791837208
L 1 0.23446702058111255
L 3 0.3080631152985971
L 0 0.16937497529905748
L 3 0.20180940426476657
L 1 0.21070308384738717
I 3 0.034250635937710945
I 3 0.051167999240398526
I 1 0.08520542680289599
I 2 0.01855621240151779
I 1 0.05148110554295586
I 3 0.07229005354732305
I 0 0.0720739090148316
I 3 0.08960282963483238
I 1 0.1241557956609432

Score -0.2433030119521747 vs -0.24327241340226088
Increase of Social Debt: -16726.428482241055
Increase of Total Savings: 112.31802111858997
Price W:26.80642123621469, N:9.416033569902083, L:22.444757607895305, I:12.393553781437365
Worker's Savings Increase: 7.426859778703818
Supply of Labors = 682
(Demand - Supply) of Labors = -0.030253556900220246
Profit Rate N:0.2511043715230468, L:0.3887094633547608, I:0.1241557956609432
Product N:2068.4356231538964, L:221.00000000000003, I:2784.1110933127125
Savings mean:9.284616526329645, variance:34.629390242175184


Score A vs B と書いているところに着目する。A が、過去すべてのデータからの最良のスコアを初期値にしたもので、B が直近のスコアを初期値にしたものである。だいたい A と B が同じか、A のほうが勝っている(スコアが少ない)ことが多いが、まれに B のほうが勝つことがある。

つまり、最適化は常に本当の最適値をうまく求められているわけではないことを少なくとも示している。

過去のすべてのデータからの最良のスコアの替わりに、各価格が 1 から 100 までのランダムに選んでその価格情法の配列 10 個から最良のものを選んでの最適化にすることも実験してみた。exp_01_06.py に --opt-try=random のオプションを与えたものがそうなる。

するとさすがにランダムの側が勝つことはなかった。

最適化の戦略をもっと一般的なものにしたほうが良いのかもしれない。SciPy 1.2 には、Global Optimization というものがある。これを利用してみる。--opt-try に basinhopping の場合は bh、differential_evolution の場合は de、shgo の場合は shgo、dual_annealing は da を与えると、先の Score A vs B の A 側がそれで求めた最適値になる。これらは基本的には数値の境界(bound)を与える必要があり、それは 1 から 100 の間とした。

なお、bh には境界の替わりに初期値を与えるものがあり、それは bh0 で指定できるようにした。また、da には境界に加えて初期値を与えるものがあり、それは da0 で指定できるようにした。これらに与える初期値は直近のデータである。

試したところ、bh と shgo はうまくいかないが、それ以外は、直近のデータから Nelder-Mead 法で求めたものより良くなることがあったが、常に良くなるわけではなく、Nelder-Mead 法のほうが良いこともあった。しかも、「発散」も、大きな変動もなかった。

shgo はとてつもなく早いが、うまくいってないのはパラメータをもう少し見直すべきなのかもしれない。が、私は最適化に詳しくないので、その追求は今後の課題としたい。

bh や shgo の失敗を鑑みると、初期値も与えていない de や da が成功することもあるのは逆にすごいのかもしれない。それらにおいても大きな変動がなかったのは、モデルの安定性を示しているように思う。

なお、アーカイブには exp_01_06.py の実行結果をダンプした exp_01_06.log を付けた。


結論


「最適化」は本当の最適化になっていなかった。

しかし、「最適化」が本当の最適化になっていないから、すなわち間違いとは言い切れない。

それは実際の経済の「最適化」がどのように行われているかによるからだ。

もちろん、次に社会は「どのように最適化しているか」が問われるのかもしれない。実際には、銀行などが何らかの動きをしている可能性はあるが、今回のような最適化アルゴリズムそのものは動いていないと見るべきだろう。そのあたりの考察は今後の課題…おそらくは他者に委ねたい…。


参考


アップデートの情報、このシリーズの他の記事へのリンク等は、exp_01_06.py についても、その1のほうで見てください。

(なお、上の実験結果および exp_01_06.log はバージョン 0.0.5 によるもの。)


ライセンス


パブリックドメイン。 (数式のような小さなプログラムなので。)

自由に改変・公開してください。


アーカイブ


今回の配布物は以下の zip ファイル。更新があれば下のリンクの中身は最新のものに置き変わっているはず。exp_01_06.py と exp_01_06.log が入っている。

更新: 2019-05-24
初公開: 2019年05月24日 23:07:06
最新版: 2020年02月13日 06:37:06

2019-05-24 23:07:01 (JST) in 経済学 | | コメント (0)

批評や挨拶のためのネットコミュニティ

  • はてなブックマーク(って何?) このエントリーをはてなブックマークに追加 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク
  • Twitter (って何?)

コメント

コメントを書く



(メールアドレス形式)


※匿名投稿を許可しています。ゆるめのコメント管理のポリシーを持っています。この記事にまったく関係のないコメントはこのリンク先で受け付けています。
※暗号化パスワードを設定すれば、後に「削除」、すなわち JavaScript で非表示に設定できます。暗号解読者を気にしないならメールアドレスでもかまいません。この設定は平文のメールで管理者に届きます。
※コメントを書くために漢字[かんじ]でルビが、[google: キーワード] で検索指定が使えます。


ランダムことわざ: 七転び八起き。