web-dev-qa-db-ja.com

制約付きのscipyで最小化関数を使用するにはどうすればよいですか

Python(scipy)の最適化関数に関していくつかの助けが必要です。問題はf(x)を最適化することです_x=[a,b,c...n]_。制約は、a、bなどの値が0から1の間である必要があること、およびsum(x)==1です。 scipy.optimise.minimize関数は微分を必要としないため、最も良いようです。引数を渡すにはどうすればよいですか?

順列を使用したndarrayの作成は長すぎます。以下の私の現在のコード:-

_import itertools as iter
all=iter.permutations([0.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0],6) if sum==1
all_legal=[]
for i in all:
if np.sum(i)==1:
    #print np.sum(i)
    all_legal.append(i)
print len(all_legal)
lmax=0
sharpeMax=0
for i in all_legal:
    if sharpeMax<getSharpe(i):
        sharpeMax=getSharpe(i)
        lmax=i
_
17
anand

docs にあるように、COBYLAまたはSLSQPを使用して制約付き最適化を行うことができます。

from scipy.optimize import minimize

start_pos = np.ones(6)*(1/6.) #or whatever

#Says one minus the sum of all variables must be zero
cons = ({'type': 'eq', 'fun': lambda x:  1 - sum(x)})

#Required to have non negative values
bnds = Tuple((0,1) for x in start_pos)

これらを組み合わせて最小化関数にします。

res = minimize(getSharpe, start_pos, method='SLSQP', bounds=bnds ,constraints=cons)
23
Daniel