2017-01-16 4 views
0

Я пытаюсь подогнать кривую к некоторым данным с помощью MCMC.Повторить до тех пор, пока не будет RuntimeWarning

Из-за характера моей конкретной проблемы, иногда (в 1/5 раза работает код) встречаются некоторые особенности, и код вызывает меня RuntimeWarning и продолжает давать неправильный ответ.

/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 

В основном это происходит потому, что я беру журнал гауссовских и один из предложенных значений средств равно одной из точек данных.

Я хотел бы повторить запуск кода, возможно, используя try и except, пока эти предупреждения Runtime не возникнут. Спасибо!

Edit: После замечания @sgDysregulation я попытался:

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

, где я попытался использовать как «пропуск» и «продолжить» заявление, поставив «сломать» в то время как петлю и внутри «попробовать ». Также попробовал «RuntimeWarning» вместо «Исключение».

Выход из фрагмента выше не показывает никаких предупреждений.

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' является [' Warning'] (https://docs.python.org/2/library/warnings.html), а не «Исключением». Вы должны сказать python, чтобы преобразовать это предупреждение в исключение, если вы хотите, чтобы оператор 'try/except' работал (например, http://stackoverflow.com/questions/16236644/userwarning-converting-a-masked-element-to- nan/16237927 # 16237927, или см. ответ @ ali_m). –

ответ

1

Вы можете использовать менеджер np.errstate контекста, чтобы поймать предупреждение, как если бы это было исключение:

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

Рекомендуется включить то, что вы пробовали до сих пор в вашем вопросе,

while True: 
    try: 
     #your code here 

     break 
    except Exception as e: 
     continue 
+0

Я пробовал это, и код продолжался, как обычно. Разве оператор break не выходит из цикла сразу после первой попытки? – Anna

+0

попробуйте продолжить, а не пропустить, я не могу проверить код с моего конца – sgDysregulation

Смежные вопросы