J'utilise scipy.minimize avec la méthode COBYLA, mais il semble que je ne puisse pas écrire les contraintes correctement car lorsque je vérifie les valeurs de la fonction objectif, elles ne respectent pas ces contraintes.Numpy Minimize COBYLA Contraintes
Fondamentalement, la fonction objective accepte un tableau comme argument, qui doit suivre deux contraintes:
- Chaque valeur du tableau doit être supérieur à 0
- La somme des valeurs doit être inférieure à 1
jusqu'à présent, je l'ai écrit ainsi:
constraints = [{'type': 'ineq', 'fun': lambda x: 1 - sum(x)},
{'type': 'ineq', 'fun': lambda x: x[0]},
{'type': 'ineq', 'fun': lambda x: x[1]}]
Cependant, parfois je reçois des valeurs supérieures à 1 ...
Voici un exemple:
from __future__ import division
from math import pow, exp
import numpy as np
from scipy.optimize import minimize
nbStudy = 3
nbCYP = 2
raucObserved = [3.98, 2.0, 0.12]
IXmat = np.matrix([[-0.98, 0], [-0.3, -0.98], [7.7, 4.2]])
NBITER = 50
estimatedCR = []
raucPred = []
varR = [0.0085, 0.0048, 0.0110]
sdR = [0.0922, 0.0692, 0.1051]
cnstrts = [{'type': 'ineq', 'fun': lambda x: 1 - sum(x)},
{'type': 'ineq', 'fun': lambda x: x}]
def fun(CR):
dum = []
for i in range(nbStudy):
crix = 0
for j in range(nbCYP):
crix += CR[j] * IXmat[i, j]
raucPredicted = 1/(1 + crix)
dum.append(pow((np.log(raucPredicted) - np.log(raucObservedBiased[i])), 2)/varR[i])
output = np.sum(dum)
return output
for iter in range(NBITER):
raucObservedBiased = []
for k in range(nbStudy):
raucObservedBiased.append(raucObserved[k] * exp(sdR[k] * np.random.normal()))
initialCR = np.matrix([[(1/nbCYP) * np.random.uniform()], [(1/nbCYP) * np.random.uniform()]])
output = minimize(fun, initialCR, method='COBYLA', constraints=cnstrts)
estimatedCR.append(output.x)
pouvez-vous donner un exemple? – cel
Je voudrais mettre un peu d'effort dans un exemple de travail minimal, de cette façon, il est plus probable d'obtenir de l'aide. – rll
Eh bien, j'espérais obtenir des informations de la part de personnes bien informées sur la manière dont les contraintes sont censées être écrites puisque la documentation officielle est si légère sur le sujet et que je n'ai rien trouvé d'utile sur le web jusqu'à présent ... Mais si vous avez vraiment besoin d'un exemple de travail que je vais essayer de produire un (mon vrai code implique beaucoup de calculs secondaires ...) – remitod