web-dev-qa-db-fra.com

Comment utiliser une fonction de minimisation dans scipy avec des contraintes

J'ai besoin d'aide concernant les fonctions d'optimisation en python (scipy) le problème est d'optimiser f(x)x=[a,b,c...n]. les contraintes sont que les valeurs de a, b etc doivent être comprises entre 0 et 1, et sum(x)==1. La fonction scipy.optimise.minimize semble la meilleure car elle ne nécessite aucun différentiel. Comment passer les arguments?

La création d'un ndarray en utilisant la permutation est trop longue. Mon code actuel comme ci-dessous: -

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

Vous pouvez faire une optimisation contrainte avec COBYLA ou SLSQP comme il est dit dans le docs .

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)

Combinez-les dans la fonction de minimisation.

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

Vérifiez la chaîne de documents .minimize:

scipy.optimize.minimize(fun, x0, args=(), method='BFGS', jac=None, hess=None, hessp=None, \
              bounds=None, constraints=(), tol=None, callback=None, options=None)

Ce qui compte le plus dans votre cas sera le bounds. Lorsque vous souhaitez contraindre votre paramètre dans [0,1] (ou (0,1)?) Vous devez le définir pour chaque variable, comme:

bounds=((0,1), (0,1).....)

Maintenant, l'autre partie, sum(x)==1. Il peut y avoir des façons plus élégantes de le faire, mais considérez ceci: au lieu de minimiser f(x), vous minimisez h=lambda x: f(x)+g(x), une nouvelle fonction essentielle f(x)+g(x)g(x) est une fonction qui atteint son minimum lorsque sum(x)=1. Tels que g=lambda x: (sum(x)-1)**2.

Le minimum de h(x) est atteint lorsque f(x) et g(x) sont au minimum. Sorte de cas de la méthode du multiplicateur de Lagrange http://en.wikipedia.org/wiki/Lagrange_multiplier

7
CT Zhu