17

私は簡単な機能を持っています

def square(x, a=1):
    return [x**2 + a, 2*x]

xいくつかのパラメータについて、最小化したいと思いますa。私は現在、精神的に次のようなことをするループを持っています:

In [89]: from scipy import optimize

In [90]: res = optimize.minimize(square, 25, method='BFGS', jac=True)

In [91]: [res.x, res.fun]
Out[91]: [array([ 0.]), 1.0]

In [92]: l = lambda x: square(x, 2)

In [93]: res = optimize.minimize(l, 25, method='BFGS', jac=True)

In [94]: [res.x, res.fun]
Out[94]: [array([ 0.]), 2.0]

これで、関数は既にベクトル化されています

In [98]: square(array([2,3]))
Out[98]: [array([ 5, 10]), array([4, 6])]

In [99]: square(array([2,3]), array([2,3]))
Out[99]: [array([ 6, 12]), array([4, 6])]

つまり、ループするよりも、すべての最適化を並行して実行する方がおそらくはるかに高速です。それはSciPyで簡単にできることですか? または他のサードパーティのツールですか?

4

3 に答える 3

22

私の最初の答えとその後の議論に基づいて、別の試みがあります。

私の知る限り、scipy.optimizeモジュールは、スカラーまたはベクトル入力とスカラー出力、つまり「コスト」を持つ関数用です。

各方程式を他の方程式から独立したものとして扱っているので、私の最善のアイデアは、マルチプロセッシングモジュールを使用して並列に作業を行うことです。最小化する関数が質問の関数と同じくらい単純である場合、努力する価値はないと思います。

関数がより複雑で、作業を分割したい場合は、次のようにしてみてください。

import numpy as np
from scipy import optimize
from multiprocessing import Pool

def square(x, a=1):
    return [np.sum(x**2 + a), 2*x]

def minimize(args):
    f,x,a = args
    res = optimize.minimize(f, x, method = 'BFGS', jac = True, args = [a])
    return res.x

# your a values
a = np.arange(1,11)

# initial guess for all the x values
x = np.empty(len(a))
x[:] = 25

args = [(square,a[i],x[i]) for i in range(10)]
p = Pool(4)
print p.map(minimize,args)
于 2012-10-15T23:33:14.573 に答える
2

あなたの意図が理解できれば、 と の両方xにnumpy 配列を渡すことができるので、すべてのパラメーターを一度にa最適化できます。a

次のようなものを試してください:

def square(x, a=1):
    return [np.sum(x**2 + a), 2*x]

# your a values
a = np.arange(1,11)

# initial guess for all the x values
x = np.empty(len(a))
x[:] = 25

# extra arguments to pass to the objective function, in this case, your a values
args = [a]

res = optimize.minimize(square, x, method = 'BFGS', jac = True, args = args)

これは正しい結果を得ているようです。

>>> res.x
[ -8.88178420e-16  -8.88178420e-16  -8.88178420e-16  -8.88178420e-16
  -8.88178420e-16  -8.88178420e-16  -8.88178420e-16  -8.88178420e-16
  -8.88178420e-16  -8.88178420e-16]
>>> res.fun
55.0
于 2012-10-13T17:05:14.250 に答える