J'ai besoin d'aide concernant les fonctions d'optimisation en python (scipy) le problème est d'optimiser f(x)
où 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
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)
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)
où 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