Alb*_*rto 2 logistic-regression pymc3
我知道ADVI / MCMC之间的数学差异,但是我试图理解使用其中一种的实际含义。我对以这种方式创建的数据运行一个非常简单的logistic回归示例:
import pandas as pd
import pymc3 as pm
import matplotlib.pyplot as plt
import numpy as np
def logistic(x, b, noise=None):
    L = x.T.dot(b)
    if noise is not None:
        L = L+noise
    return 1/(1+np.exp(-L))
x1 = np.linspace(-10., 10, 10000)
x2 = np.linspace(0., 20, 10000)
bias = np.ones(len(x1))
X = np.vstack([x1,x2,bias]) # Add intercept
B =  [-10., 2., 1.] # Sigmoid params for X + intercept
# Noisy mean
pnoisy = logistic(X, B, noise=np.random.normal(loc=0., scale=0., size=len(x1)))
# dichotomize pnoisy -- sample 0/1 with probability pnoisy
y = np.random.binomial(1., pnoisy)
我像这样运行ADVI:
with pm.Model() as model: 
    # Define priors
    intercept = pm.Normal('Intercept', 0, sd=10)
    x1_coef = pm.Normal('x1', 0, sd=10)
    x2_coef = pm.Normal('x2', 0, sd=10)
    # Define likelihood
    likelihood = pm.Bernoulli('y',                  
           pm.math.sigmoid(intercept+x1_coef*X[0]+x2_coef*X[1]),
                          observed=y)
    approx = pm.fit(90000, method='advi')
不幸的是,无论我增加多少采样,ADVI似乎都无法恢复我定义的原始beta [-10。,2.,1.],而MCMC可以正常工作(如下所示)
谢谢您的帮助!
这是个有趣的问题!'advi'PyMC3中的默认值是平均场变化推论,这在捕获相关性方面做得不好。事实证明,您建立的模型具有一个有趣的相关结构,可以从中看到:
import arviz as az
az.plot_pair(trace, figsize=(5, 5))
PyMC3具有内置的收敛性检查器-对太长或太短运行优化都会导致有趣的结果:
from pymc3.variational.callbacks import CheckParametersConvergence
with model:
    fit = pm.fit(100_000, method='advi', callbacks=[CheckParametersConvergence()])
draws = fit.sample(2_000)
在我进行约60,000次迭代后,此操作停止。现在我们可以检查相关性,并发现,正如预期的那样,ADVI拟合了轴对齐的高斯:
az.plot_pair(draws, figsize=(5, 5))
最后,我们可以比较NUTS和(平均域)ADVI的拟合度:
az.plot_forest([draws, trace])
请注意,ADVI低估了方差,但对于每个参数的均值来说却相当接近。另外,您可以设置method='fullrank_advi'为捕获更好的关联。
(注意:arviz即将成为PyMC3的绘图库)
| 归档时间: | 
 | 
| 查看次数: | 255 次 | 
| 最近记录: |