我正在尝试最小化我的函数“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内核由于没有足够的内存而关闭。如果我仅使用DataList中的前100个条目,它将在4.1秒内找到结果,但是如果我使用DataList [[1 ;; 1000]]或更多条目,则内核崩溃。
有人知道为什么NMinimize函数使用这么多的内存吗?我需要将每个列表中的150'000个事件最小化...
感谢您的回答,
干杯,
安德烈亚斯
最佳答案
我猜(但没有进行任何检查),问题是在每次调用函数时,Mathematica都试图构造一个从所有数据派生的符号表达式,并且占用的内存比您期望的要多得多。
无论如何,好消息是-您可以将函数转换为更简单的函数,如果您不久之后就忘记了这个问题。
因此,首先,2.35
和1/2
只是将您的函数更改为常数,而不会影响最小值的位置,因此我们将其忽略。接下来,您的函数始终为非负数,因此将其最小化与将其平方最小化相同,因此让我们开始吧。
因此,现在您尝试最小化var(aw + bx + cy + dz)/ mean(aw + bx + cy + dz)^ 2,其中w,x,y,z是(也许很长) vector 。
现在,您的分子和分母都是a,b,c,d的二次形式,其系数(以固定方式)取决于这些 vector 。具体来说,假设 vector 的长度为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)。
因此,您可以采用大 vector ,一次计算相关系数,然后只要求Mathematica优化形式的函数(二次/二次),这应该很容易。