2016-07-13 1 views
-1

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:

  1. Chaque valeur du tableau doit être supérieur à 0
  2. 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) 
+0

pouvez-vous donner un exemple? – cel

+0

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

+0

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

Répondre

0

Vous n'êtes pas vérifier que le solveur convergé (output.success == True) --- et votre cas ne converge pas. S'il n'y a pas de convergence, rien n'est garanti sur les contraintes.

+0

Ça converge! Je reçois le output.success == True à chaque fois ... – remitod

0

Apparemment un problème de version, le problème a été résolu depuis. J'utilisais Python 2.7 et Scipy 0.13 ...