为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-11-16 16:58:53
我有一个问题:我试图找到一个函数的最小值,该函数取决于我也想更改的几个参数。让我们举一个简单的例子:import numpy as npimport scipy.optimize as optdef f(x, a, b, c):    f = a * x**2 + b * x + creturn f我想找到使 a、b、c 的不同组值的函数最小化的 x,让我们说a = [-1, 0, 1]b = [0, 1, 2]c = [0, 1]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)这对于我正在做的计算来说真的很慢,但到目前为止我还没有找到更好的。那么,有没有人知道可以让我提高效率的方法或包?
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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

  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)

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


查看完整回答
反对 回复 2021-11-16
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

scipy.optimize.newton 可以做到这一点。


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信