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]]]

四个参数 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 内核因为内存不足而关闭。如果我只使用我的 DataLists 中的前 100 个条目,它会找到我的结果(在 4.1 秒内),但如果我使用 DataList[[1;;1000]] 甚至更多条目,内核就会崩溃。

有谁知道,为什么 NMinimize 函数使用这么多内存?我需要在每个列表中最小化 150'000 个事件......

谢谢你的回答,干杯,安德烈亚斯

4

1 回答 1

1

我猜想(但没有以任何方式检查)问题在于,在每次调用您的函数时,Mathematica 都试图构造一个从您的所有数据派生的符号表达式,并且占用的内存比您预期的要多得多。

不管怎样,好消息——如果你不久之后就忘记了这个问题——你可以把这个函数变成更简单的东西。

所以,首先, the2.351/2s 只是通过一个常数因子改变你的函数并且不影响最小值的位置,所以让我们忽略它们。接下来,你的函数总是非负的,所以最小化它与最小化它的平方是一样的,所以让我们这样做。

所以现在你试图最小化 var(aw+bx+cy+dz)/mean(aw+bx+cy+dz)^2 其中 w,x,y,z 是(可能很长)向量。

现在您的分子和分母都只是 a,b,c,d 的二次形式,其系数取决于(以固定方式)这些向量。具体来说,假设您的向量长度为​​ N。那么您的函数就是

[sum(aw+bx+cy+dz)^2/N - sum(aw+bx+cy+dz)^2/N^2] / (sum(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)。

所以你可以用你的大向量,计算一次相关系数,然后让 Mathematica 优化一个形式的函数(二次/二次),这应该很轻松。

于 2013-06-13T10:09:53.510 回答