2017-01-16 3 views
0

Ich versuche, eine Kurve an einige Daten mit MCMC anzupassen.Wiederholen bis keine RuntimeWarning

Aufgrund der Natur meines speziellen Problems, gelegentlich (1/5 mal mit dem Code) einige Singularitäten angetroffen und der Code wirft mir eine RuntimeWarning und fährt fort, eine falsche Antwort zu geben.

/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 

Dies geschieht im Grunde, weil ich ein Protokoll einer Gaußschen nehmen und eine der vorgeschlagenen Werte des Mittels ist gleich einer der Datenpunkte.

Ich möchte den Code erneut versuchen, vielleicht mit try und except, bis diese Laufzeitwarnungen nicht auftreten. Danke!

Edit: einen Kommentar von @sgDysregulation Nach ich versucht habe:

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

wo ich versucht habe, beide „Pass“ können und „weiter“ Aussagen „brechen“ innerhalb while-Schleife setzen und innen „versuchen ". Habe auch "RuntimeWarning" anstelle von "Exception" versucht.

Die Ausgabe aus dem obigen Snippet zeigt keine Warnungen an.

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 'ist ein [' Warning'' (https://docs.python.org/2/library/warnings.html), keine 'Exception'. Sie müssen python mitteilen, dass diese Warnung in eine Ausnahme umgewandelt werden soll, wenn die Anweisung 'try/except' funktionieren soll (zB http://stackoverflow.com/questions/16236644/userwarning-converting-a-masked-Element-to- nan/16237927 # 16237927, oder siehe @ ali_m's Antwort). –

Antwort

1

Sie den Manager np.errstate Kontext verwenden können, um die Warnung zu fangen, als ob es eine Ausnahme waren:

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

Es wird empfohlen, Sie sind, was Sie bisher in Ihrer Frage versucht,

while True: 
    try: 
     #your code here 

     break 
    except Exception as e: 
     continue 
+0

Ich habe das versucht und der Code geht weiter wie immer. Führt die Break-Anweisung nicht dazu, dass die Schleife sofort nach dem ersten Versuch beendet wird? – Anna

+0

versuchen Sie weiter statt übergeben, ich kann den Code von meinem Ende nicht testen – sgDysregulation

Verwandte Themen