如何优化 python 中向量函数的最小化?
how to optimize the minimization of a vector function in python?
我有一个问题:我试图找到一个函数的最小值,它取决于我也想更改的几个参数。让我们举个简单的例子:
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)
这对于我正在做的计算来说真的很慢,但到目前为止我还没有找到更好的方法。那么,有没有人知道可以让我提高效率的方法或包?
您可以结合使用不同的技术来提高脚本的效率:
- 使用
itertools.product
生成列表中所有可能的组合a, b, c
- 使用
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 秒。
scipy.optimize.newton
可以做到。
我有一个问题:我试图找到一个函数的最小值,它取决于我也想更改的几个参数。让我们举个简单的例子:
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)
这对于我正在做的计算来说真的很慢,但到目前为止我还没有找到更好的方法。那么,有没有人知道可以让我提高效率的方法或包?
您可以结合使用不同的技术来提高脚本的效率:
- 使用
itertools.product
生成列表中所有可能的组合a, b, c
- 使用
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 秒。
scipy.optimize.newton
可以做到。