我正在尝试最小化我的功能“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个事件进行最小化...
感谢您的回答, 干杯, 安德烈亚斯
答案 0 :(得分:1)
我猜(但是没有以任何方式检查过)问题是每次调用你的函数时,Mathematica都试图构造一个从你的所有数据派生出来的符号表达式,并占用比你更多的内存。期待。
无论如何,好消息 - 如果你不久之后就已经忘记了这个问题 - 就是你可以把这个功能变成更简单的东西。
所以,首先,2.35
和1/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优化形式的函数(二次/二次),这应该是非常轻松的。