【问题标题】:how to optimize the minimization of a vector function in python?如何优化python中向量函数的最小化?
【发布时间】:2019-07-16 19:52:00
【问题描述】:

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

import numpy as np
import scipy.optimize as opt
def f(x, a, b, c):
    f = a * x**2 + b * x + c
return 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)

这对于我正在做的计算来说真的很慢,但到目前为止我还没有找到更好的方法。那么,有没有人知道可以让我提高效率的方法或包?

【问题讨论】:

  • 您查看过p1,p2,p3 不同值的优化统计信息吗?大概minimize 对每个解决方案采用不同的最佳路径,具有不同的迭代次数和试验值。因此,尝试一次最小化几组参数可能不是最优的。
  • 你不能跳过c 循环吗?这两个值的解决方案没有区别,不是吗?而且我怀疑这些解决方案可能会以a/b 比率或类似的比例扩展。我可能对这些直觉有误,但无论如何,一些预先计算的数学可能会帮助您减少迭代空间。
  • 是的,谢谢,但我可能没有正确解释自己:这是一个简化的例子,实际计算的计算要求更高。我会尽量在文本中更清楚地说明这一点

标签: python numpy optimization scipy minimize


【解决方案1】:

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

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

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

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

这是工作代码。

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 秒。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2012-05-29
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2013-10-09
      相关资源
      最近更新 更多