PyMC3 pm.sample()でAttributeErrorが出る
Traceback (most recent call last): File "test_pymc.py", line 18, in <module> trace = pm.sample(niter, step, start) File "pymc3/sampling.py", line 224, in sample init = init.lower() AttributeError: 'dict' object has no attribute 'lower'
pipでバージョンを指定せずに導入したのでPyMC3のバージョンは3.1だった。
とりあえずの解決策はPyMC3のバージョンを3.0にダウングレードすること。
python -m pip install pymc3==3.0
もう一つの解決策はpm.sample()の引数の書き方を変えること。
trace = pm.sample(niter, step=step, start=start, init='ADVI')
PyMCについて詳しくないので適当に調べた経緯を以下に。
https://github.com/pymc-devs/pymc3/issues/2357
Git-hubのissueで開発者が一方的にコメントしClose、解決したかのようになっているが、実際にはpm.sample()の書き方によってはエラーが残る。
https://qiita.com/yadoyado128/items/e4a8d8fa23ec76473d5c
で紹介されているように
trace = pm.sample(niter, step, start)
と書くとv3.1ではエラーが出る。v3.0ではそのまま動く。
issueで指摘されているようにinit='ADVI'などと入れたい場合、
trace = pm.sample(niter, step=step, start=start, init='ADVI') or trace = pm.sample(draws=niter, step=step, start=start, init='auto')
などのように別の書き方が必要。これならv3.1でも動く。
http://docs.pymc.io/api/inference.html?highlight=metropolis#module-pymc3.sampling
(公式Documentより)
3.0 => 3.1 でどうしてここまで変わるのか……