【问题标题】:Mathematica NMinimize runs into memory problemsMathematica NMinimize 遇到内存问题
【发布时间】:2012-11-05 14:46:22
【问题描述】:

我正在尝试最小化我的函数“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 个事件...

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

【问题讨论】:

  • 只是为了确定,如果 expr = 1/2 (a dl1 + b dl2 + c dl3 + d dl4)(2.35*Sqrt[Variance[ expr]]/Mean[expr]) 您希望最小化?
  • 是的,这是真的。它实际上是我想要最小化的四个不同能量通道的相对分辨率。

标签: memory wolfram-mathematica minimize


【解决方案1】:

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

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

所以,首先,2.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 优化形式(二次/二次)的函数,这应该很轻松。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2013-03-25
    相关资源
    最近更新 更多