Mathematica NMinimize会遇到内存问题

时间:2012-11-05 14:46:23

标签: memory wolfram-mathematica minimize

我正在尝试最小化我的功能“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个事件进行最小化...

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

1 个答案:

答案 0 :(得分:1)

我猜(但是没有以任何方式检查过)问题是每次调用你的函数时,Mathematica都试图构造一个从你的所有数据派生出来的符号表达式,并占用比你更多的内存。期待。

无论如何,好消息 - 如果你不久之后就已经忘记了这个问题 - 就是你可以把这个功能变成更简单的东西。

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

所以现在你试图最小化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优化形式的函数(二次/二次),这应该是非常轻松的。