Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scipy.optimize.minimize:为什么全局最小化损失函数比使用Scipy minimize的局部最小化损失函数慢得多?_Python_Numpy_Optimization_Scipy - Fatal编程技术网

Python Scipy.optimize.minimize:为什么全局最小化损失函数比使用Scipy minimize的局部最小化损失函数慢得多?

Python Scipy.optimize.minimize:为什么全局最小化损失函数比使用Scipy minimize的局部最小化损失函数慢得多?,python,numpy,optimization,scipy,Python,Numpy,Optimization,Scipy,我这里有两个要最小化的损失函数: 第一个是本地的,其中: 最小f1(x1), 最小f2(x2), 最小f3(x3),。。。。 最小fn(xn) 另一个是全局的,其中: 最小f(x1,x2,…,xn)=f1(x1)+f2(x2)+…fn(xn) 对于每个局部问题fi(x),我有2个变量需要优化,我有1000个局部问题。相应地,对于全局问题,我有2000个变量需要优化。当然,第二个有更多的参数需要优化,但由于f1、f2、f3…fn是相互独立的,我希望他们两个应该是可比的 我使用scipy最小化函数进

我这里有两个要最小化的损失函数:

第一个是本地的,其中:

最小f1(x1), 最小f2(x2), 最小f3(x3),。。。。 最小fn(xn)

另一个是全局的,其中:

最小f(x1,x2,…,xn)=f1(x1)+f2(x2)+…fn(xn)

对于每个局部问题fi(x),我有2个变量需要优化,我有1000个局部问题。相应地,对于全局问题,我有2000个变量需要优化。当然,第二个有更多的参数需要优化,但由于f1、f2、f3…fn是相互独立的,我希望他们两个应该是可比的

我使用scipy最小化函数进行优化(scipy.optimize.minimize)。但是第二个比第一个慢得多

我认为,全局的唯一缺点是采用比实际需要更多的梯度。例如,x1的梯度仅来自f1,但全局从f2计算其梯度,f3。。。fn,它是0。因此,使其变慢。如果是这样的话,我真的希望会有一些加速的方法


顺便说一句,因为我以后需要为优化添加一个全局约束,这就是为什么我必须使用全局损失函数而不是局部损失函数

我认为你的猜测是正确的,它需要更多的时间是因为它需要计算梯度。根据scipy.optimize.minimize()的描述页面,如果提供jac=False(可选,默认设置为False),则该方法似乎会以数字方式计算渐变

jac:bool或callable,可选

目标函数的雅可比(梯度)。仅适用于CG、BFGS、牛顿CG、L-BFGS-B、TNC、SLSQP、狗腿、信任ncg、信任krylov、信任区域精确。如果jac是一个布尔值且为真,则假定fun随目标函数返回梯度。如果为False,将以数值方式估计梯度。jac也可以是返回目标梯度的可调用函数。在这种情况下,它必须接受与fun相同的参数

基于以上内容,可以设置jac=True,然后将函数作为可调用函数提供,该函数返回函数值和梯度。这将加快这一进程。
另一种方法是将您自己的可定制极小值编写为可调用。

Hm,对于局部极小值(n极小值),您需要计算多少东西?对于全局极小化(m参数函数的所有极值,这要糟糕得多),需要计算多少东西。这与scipy或编程无关,但这是您正在解决的问题的固有特性……是的,解决2000个参数的函数远比解决100个2个参数的函数差(这很明显,不是吗?)不。如果你这么想的话,你还没有给出这么多背后的数学原理。你的2000参数函数可能非常简单,但SciPy不知道这一点。SciPy只看到一个2000个参数的黑盒子。它必须执行完全通用的2000变量最小化,而不是1000个单独的2变量优化问题。谢谢。我也是这么想的。但是有没有办法让scipy知道它不需要这么多不必要的计算?就像放一些预先计算的梯度,让它知道大多数梯度实际上是0?事实上,我觉得很遗憾的是,scipy没有一个内置的最小值来处理这种依赖结构。当做数十万个完全独立的最小化时,能够一次完成它们将是非常好的,而不是浪费那么多时间在口译员和一遍又一遍地设置相同的最小化。我同意。但是,您应该始终认为通用优化器通常是为最一般的情况编写的。它们不应该针对特定的结构或问题进行优化。另一方面,如果您想快速尝试一个想法,它可以大大缩短开发时间。但是,如果您想拥有一个优化的解决方案,您需要更改或放弃它们以获得更好的优化解决方案。