3

次のように定義されている関数「FunctionToMinimize」を最小化しようとしています。

FunctionToMinimize[a_, b_, c_, d_] := (2.35*Sqrt[
   Variance[1/2*
     (a*#1 + b*#2 + c*#3 + d*#4)
    ]
   ]
  /Mean[1/2*(a*#1 + b*#2 + c*#3 + d*#4)]) 
&[DataList1[[1 ;; 1000]],DataList2[[1 ;; 1000]],
DataList3[[1 ;; 1000]], DataList4[[1 ;; 1000]]]

4 つのパラメーター a、b、c、および d は、0.5 から 1.5 の間のどこかに制限されています。私の問題は今、私が電話した場合

NMinimize[{Funktion[w, x, y, z],
0.75 < w < 1.25 && 0.75 < y < 1.25 && 0.75 < x < 1.25 && 0.75 < z < 1.25}, 
{w, x, y, z}]

Mathematica カーネルは十分なメモリがないためにシャットダウンします. DataList の最初の 100 エントリのみを使用すると、(4.1 秒で) 結果が得られますが、DataList[[1;;1000]] またはそれ以上のエントリを使用すると、カーネルがクラッシュします。

NMinimize 関数が大量のメモリを使用する理由を知っている人はいますか? 各リストで 150,000 件のイベントを最小化する必要があります...

答えてくれてありがとう、乾杯、アンドレアス

4

1 に答える 1

1

問題は、関数を呼び出すたびに、 Mathematica がすべてのデータから派生したシンボリック式を作成しようとしていて、予想よりもはるかに多くのメモリを占有していることだと思います(ただし、まったくチェックしていません)。

いずれにせよ、この問題を忘れてしばらく経っていないのであれば、良いニュースは、この関数をもっと単純なものに変えることができるということです。

まず第一に、2.351/2s は関数を一定の係数で変更するだけで、最小値がどこにあるかには影響しないので、それらを無視しましょう。次に、関数は常に非負であるため、最小化することはその平方を最小化することと同じなので、そうしましょう。

w,x,y,z は (おそらくかなり長い) ベクトルです。

これで、分子と分母はどちらも a、b、c、d の 2 次形式になり、係数はこれらのベクトルに (一定の方法で) 依存します。具体的には、ベクトルの長さが N であるとします。その場合、関数は

[合計(aw+bx+cy+dz)^2/N - 合計(aw+bx+cy+dz)^2/N^2] / (合計(aw+bx+cy+dz)^2/N^ 2)

N sum(aw+bx+cy+dz)^2 / sum(aw+bx+cy+dz)^2 - 1 のように書くことをお勧めします。

その分数では、たとえば、分子の bc の係数は 2 sum(xy) であり、分母の係数は 2 sum(x) sum(y) です。

したがって、大きなベクトルを取得し、関連する係数を 1 回計算してから、(二次/二次) 形式の関数を最適化するように Mathematica に依頼するだけで済みます。これは非常に簡単です。

于 2013-06-13T10:09:53.510 に答える