如何优化Python中向量函数的最小化?

mmo*_*nti 0 python optimization numpy minimize scipy

我有一个问题:我试图找到一个函数的最小值,该函数取决于我也想更改的几个参数。让我们举一个简化的例子:

import numpy as np
import scipy.optimize as opt
def f(x, a, b, c):
    f = a * x**2 + b * x + c
return f
Run Code Online (Sandbox Code Playgroud)

我想找到使 a、b、c 的不同值集的函数最小化的 x,比如说

a = [-1, 0, 1]
b = [0, 1, 2]
c = [0, 1]
Run Code Online (Sandbox Code Playgroud)

ATM 我有三个嵌套循环和一个最小化:

for p1 in a:
    for p2 in b:
         for p3 in c:
            y = opt.minimize(f, x0=[0, ], args=(p1, p2, p3, ))
            print(y)
Run Code Online (Sandbox Code Playgroud)

这对于我正在进行的计算来说确实很慢,但到目前为止我还没有找到更好的方法。那么,有谁知道一种可以让我提高效率的方法或方案吗?

f.w*_*wue 5

您可以结合使用不同的技术来提高脚本的效率:

  1. 用于itertools.product生成列表中每种可能的组合a, b, c
  2. 用于multiprocessing并行执行最小化。

除此之外,我想不出有什么方法可以优化代码的效率。正如评论中指出的,常数值 c 对最小化没有影响。但我确信二次函数只是一个例子。

我从这里获取了多处理部分的代码。

这是工作代码。

import numpy as np
import scipy.optimize as opt
import itertools
from multiprocessing import Pool

def f(x, a, b, c):
    f = a * x**2 + b * x + c
    return f

def mini(args):
    res = opt.minimize(f, x0=np.array([0]), args=args)
    return res.x

if __name__=="__main__":
    a = np.linspace(-1,2,100)
    b = np.linspace(0,2,100)
    c = [0, 1]
    args = list(itertools.product(a,b,c))
    print("Number of combos:" + str(len(args)))
    p = Pool(4)
    import time
    t0 = time.time()
    res = p.map(mini, args)
    print(time.time()-t0)
Run Code Online (Sandbox Code Playgroud)

即使是这 20000 种组合,在我的普通笔记本电脑上也只需要 5.28 秒。