2017-01-16 1 views
0

J'essaie d'ajuster une courbe à certaines données en utilisant MCMC.Retry until no RuntimeWarning

En raison de la nature de mon problème particulier, occasionnellement (1/5 fois l'exécution du code) certaines singularités sont rencontrées et le code me soulève un RuntimeWarning et continue à donner une mauvaise réponse.

/Library/Python/2.7/site-packages/emcee-2.2.1-py2.7.egg/emcee/ensemble.py:335: RuntimeWarning: invalid value encountered in subtract 
/Library/Python/2.7/site-packages/emcee-2.2.1-py2.7.egg/emcee/ensemble.py:336: RuntimeWarning: invalid value encountered in greater 

Cela se produit essentiellement parce que je prends un journal d'une gaussienne et l'une des valeurs proposées de moyens est égal à l'un des points de données.

Je voudrais réessayer d'exécuter le code, en utilisant peut-être try and except, jusqu'à ce que ces avertissements d'exécution ne se produisent pas. Merci!

Edit: Après un commentaire par @sgDysregulation J'ai essayé:

while True: 
    try: 
     print "Before mcmc" 
     sampler.run_mcmc(pos, 500) 
     print "After mcmc" 
     break 
    except Exception as e: 
     print "Warning detected" 
     continue 

où j'ai essayé d'utiliser les deux « passe » et « continuer » déclarations, mettant « casser » à l'intérieur et à l'intérieur en boucle « essayer ". J'ai également essayé "RuntimeWarning" au lieu de "Exception".

La sortie de l'extrait ci-dessus ne montre aucun avertissement détecté.

Before mcmc 
/Library/Python/2.7/site-packages/emcee-2.2.1-py2.7.egg/emcee/ensemble.py:335: RuntimeWarning: invalid value encountered in subtract 
/Library/Python/2.7/site-packages/emcee-2.2.1-py2.7.egg/emcee/ensemble.py:336: RuntimeWarning: invalid value encountered in greater 
After mcmc 
+0

'RuntimeWarning' est un [' Warning'] (https://docs.python.org/2/library/warnings.html), pas une 'Exception'. Vous devez indiquer à python de convertir cet avertissement en exception si vous voulez que l'instruction 'try/except' fonctionne (par exemple http://stackoverflow.com/questions/16236644/userwarning-converting-a-masked-element-to- nan/16237927 # 16237927, ou voir la réponse de @ ali_m). –

Répondre

1

Vous pouvez utiliser le gestionnaire de contexte np.errstate pour attraper l'avertissement comme si elle était une exception:

while True: 
    try: 
     print("Before mcmc") 
     with np.errstate(all='raise'): 
      sampler.run_mcmc(pos, 500) 
     print("After mcmc") 
     break 
    except Exception: 
     print("Warning detected") 
     continue 
0

Il vous est recommandé d'inclure ce que vous avez essayé jusqu'à présent dans votre question,

while True: 
    try: 
     #your code here 

     break 
    except Exception as e: 
     continue 
+0

J'ai essayé ceci et le code continue comme d'habitude. Est-ce que l'instruction break ne le fait pas quitter la boucle immédiatement après le premier essai? – Anna

+0

essayez continuer au lieu de passer, je ne peux pas tester le code de ma fin – sgDysregulation