- 締切済み
Excelで最大値を与える説明変数求める方法
ソルバーを使うと結構な確率でエラーになります。 共役傾斜法とか準ニュートン法ってのが「最初にどこからスタートするか」に依存するからのような気がするのですが、そこで、 (1)適当に正規分布に従う乱数を100個発生させる。 (2)その乱数を説明変数にして目的変数を得る。これを100回繰り返す。 (3)100個の目的変数が得られたら、そのうち目的変数の値が大きい方から上位50個についての説明変数の標準偏差を求める(下位50個は捨てる) (4)上位50個の目的変数のうちでも最大値を与える説明変数1つを選らんで平均値とし、(3)で求めた上位50個の標準偏差を標準偏差として、この2つのパラメータにて正規分布に従う乱数を50個出す。 (5)先ほど(3)で使った上位50個の説明変数(下位50個は捨てる)と(4)の50個説明変数の計100個より100個の目的変数を得る (6)以後(3)~(5)を何度も何度も繰り返す。そのうちに上位50個の標準偏差がだんだん小さくなってくる。ある程度小さくなったところで、そのときの説明変数を「目的変数を最大にする説明変数」とする。 というVBAのマクロを組んでみたところ、時間はかなりかかるするものの(と言っても等間隔の目的変数をしらみつぶしにする方法よりははるかに速い)、エラーになりにくい(もちろん関数が収束するなら)し、結果を念のためソルバーに入れてやるとほぼそこから答えが動かない、と、結構いいような気がするのですが、悲しいことに基礎的な素養が無いからこれが数理的に正しいことなのかわかりません。 感覚的には正しい気がするのですが、いかがなものでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- rabbit_cat
- ベストアンサー率40% (829/2062)
質問者さんが考えた方法は、遺伝的アルゴリズムの一種ですね。 収束すれば、少なくともlocal maximum(局所最大値)にはなっているのではないでしょうか。 制約なしの最適化問題(目的変数がとれる範囲などが決まっていない場合)に対して非常に強力な、遺伝的アルゴリズムとして、 Differential Evolution(DE法) っていうものがあります。 質問者さんのアイディアと似ている部分もあるような気もします。ちょっと違いますが。 DE法は、実際かなり強力で、目的関数がぐにゃぐにゃしてる場合(いたるところに、local maximumがあるような場合)にも、結構使えます。 http://en.wikipedia.org/wiki/Differential_evolution
- f272
- ベストアンサー率46% (8469/18132)
数理的に正しいって言うのがどういう意味かよくわからないけど、極大値を求める方法のひとつですね。それが最大値であるかどうかは、説明変数から目的変数を得る式の形によるのでなんともいえません。その式がかなり滑らかであれば不必要に多量の計算をしていることになりますが、式がかなりでこぼこの時にはよい方法です。 私なら、一様分布に従う乱数をつくりそれを説明変数の初期値にして共役傾斜法とか準ニュートン法を使います。うまくいかないのであれば次の乱数を作り、またそれを説明変数の初期値にして共役傾斜法とか準ニュートン法を使います。滑らかな式で表されているのでしたらこれで十分です。
お礼
最初は一様分布、と言うか探索する範囲を等間隔で区切って→その中で最大値を求めて→範囲を狭くして行って…という方法をやったのですが、とても時間がかかってVBAごときじゃ実用にならなかったんですよね。で、正規分布なら凸部分がどんどん高い方へ向いていくだろう、というアイディアでした。 ちなみに、ということでExcelのファイルを添付したかったのですが、音声とか画像でないと受け付けてくれないんですよね。拡張子をmp3とかに変えてみても駄目でした。
お礼
うわぁ~英語だぁ…日本語でも分からんのに自分にはちょっと荷が重いですが、「遺伝的アルゴリズム」というキーワードが分かったので、それを手がかりにちょっと勉強してみます。