目录
1. PyMC3安装
参照[1], 按照以下步骤进行安装(难得的一帆风顺):
- conda create -n pm3env -c conda-forge "python=3.8" libpython mkl-service m2w64-toolchain numba python-graphviz scipy
- conda activate pm3env
- pip install pymc3
原文没有上面的第2步,应该是漏掉了。没有第2步的话,所安装的pymc3就不在pm3env中了。
一开始没有执行第2步直接安装pymc3,发现错了后把pymc3从base环境删除掉。
conda uninstall pymc3
咦?找不到pymc3? 运行conda list是可以看到列表中明明包含pymc3的。喔,想起来刚才用的是pip安装的,而不是conda。也许解铃还须系铃人,要用pip才能卸载掉用pip安装的包吧。
pip uninstall pymc3
嗯,果然。但是,问题就来了:
- conda安装与pip安装有什么区别呢?
- 既然是在conda的环境中,为什么要用pip安装而不是用conda安装呢?
- 为什么不能用conda卸载pip安装的包,尽管conda list可以显示出所安装的包呢?
Anyway,卸载base环境下的pymc3后执行conda activate pm3env后再在pm3env中执行pip install pymc3,然后再执行import pymc3,这次没有报错。
接着在pm3env中试着想打开jupyter,发现不行。意识到在pm3env中要另行安装jupyter:
conda install jupyter
但是这样貌似很蛋疼,岂不是每一个virtualenv中都要独立安装一套所有需要使用的包?
2. Hello Project
本例取自于[2],目的仅在于看看安装好的PyMC3环境是否能够正常工作。
(1) 导入所需要的各种包
import numpy as np
import pymc3 as pm
import scipy.stats as stats
from matplotlib import pyplot as plt
from IPython.core.pylabtools import figsize
#import theano.tensor as tt # Unused. It is OK to comment out it.
(2)生成观测数据
真正的项目中当然是从实际观测中获取数据。但是这里只是做个实验,所以用已知的参数基于软件的方式生成随机数,然后再进行贝叶斯推断看看所估计得到的参数值与生成数据时所使用的参数值(称为ground truth)进行对比可以确认贝叶斯推断的表现如何。这是常用的算法性能评估手段。
# Observed data generation
np.random.seed(123)
trials = 20
theta_gt = 0.35 # unknown value in a real experiment. 'gt' means ground-truth
data = stats.bernoulli.rvs(p=theta_gt, size=trials)
print(data)
(3) 构建模型
# Model construction and inference
with pm.Model() as hello_model:
theta = pm.Beta('theta', alpha=1., beta=1.)
y = pm.Bernoulli('y', p=theta, observed=data)
(4) Perform the inference
with hello_model:
# step = pm.Metropolis()
# trace = pm.sample(10000, tune=5000,random_seed=123)
trace = pm.sample(1000, random_seed=123)
以上代码执行后显示以下信息,至少看上去正常工作了(warning先不管反正看不懂^-^)
(5) 后验概率信息分析
figsize(12.5, 10)
plt.hist(theta_samples, bins=30, density=True)
plt.title(r"Posterior distributions of $\theta$")
生成如下关于theta的后验概率分布图(归一化后的直方图):
用arviz可以生成更炫一点的分析图,如下所示:
import arviz as az
az.summary(trace)
az.plot_posterior(trace)
az.plot_posterior(trace, ref_val=0.5)
生成图如下所示:
好了,走完一个最基本的基于PyMC3的贝叶斯推断的全过程。 其中细节容我慢慢咀嚼,有了学习心得再来补充。
但是,有一个问题是,以上代码在jupyter notebook中运行正常。但是作为python脚本在Anaconda Prompt(of course in pm3env)中以"python HelloPyMC.py"就会报告运行错误,如下所示:
到这里为止跟jupyter notebook中运行输出相同,然后就开始出错了,最后报错如下:
然后就死掉了,“Ctrl+C” 都无法退出,只能强行关闭窗口。原因待查。难道跟什么多线程啥的有关系?
[Reference]
[1] https://github.com/pymc-devs/pymc3/wiki/Installation-Guide-(Windows)
[2] How to build probabilistic models with PyMC3 in Bayesian - ThePythonGuru.com