本文作为贝叶斯方法与图模型学习笔记, 代码(https://github.com/memoiry/bayesian-methods-for-hackers)

图很好的解释了贝叶斯模型与贝叶斯公式, 在拥有先验知识的情况下, 接受外来数据(likelihood), 在此数据下形成后验概率.


Pymc模型

pymc简单使用

%matplotlib inline
from IPython.core.pylabtools import figsize
from matplotlib import pyplot as plt
import pymc as pm
lambda_ = pm.Exponential("poisson_param",1)
data_generator = pm.Poisson("data_generator", lambda_)
lambda_1 = pm.Exponential("lambda_1", 1) # prior on first behavior
lambda_2 = pm.Exponential("lambda_2", 1) # 
figsize(12.5, 4)
plt.rcParams['savefig.dpi'] = 300
plt.rcParams['figure.dpi'] = 300
samples = [lambda_1.random() for i in range(20000)]
plt.hist(samples, bins=70, normed=True, histtype="stepfilled")
plt.title("Prior distribution for $\lambda_1$")
plt.xlabel("Value")
plt.ylabel("Density")
plt.xlim(0, 8);

pymc把变量分为母变量和子变量, 变量之间会相互影响, 进一步可以把变量分为决定变量和随机变量, 使用@pm.deterministic在函数定义前即可

对一个网站流量分析问题, 其流量分布, 为了观察是否有显著性的改变, 一般来说流量分布具有泊松分布, 而泊松分布的系数$\lambda$服从指数分布, 所以有以下图模型

流量的模拟

给定alpha与随机分布变量tau, 就可以模拟一个网站流量的分布, 这里$\alpha=0.05$, tau服从0-80之间的离散均匀分布

tau = pm.rdiscrete_uniform(0, 80)
alpha = 1./20.
lambda_1, lambda_2 = pm.rexponential(alpha, 2)
print lambda_1, lambda_2
lambda_ = np.r_[ lambda_1*np.ones(tau), lambda_2*np.ones(80-tau) ]
print lambda_
data = pm.rpoisson(lambda_)
print data
plt.bar(np.arange(80), data,color="#348ABD")
plt.bar(tau-1, data[tau - 1], color="r", label="user behavior changed")
plt.xlabel("Time (days)")
plt.ylabel("Text messages received")
plt.title("Artificial dataset from simulating the model")
plt.xlim(0, 80)
plt.legend();

多次模拟有

def plot_artificial_sms_dataset():
    tau = pm.rdiscrete_uniform(0, 80)
    alpha = 1./20.
    lambda_1, lambda_2 = pm.rexponential(alpha, 2)
    lambda_ = np.r_[ lambda_1*np.ones(tau), lambda_2*np.ones(80-tau) ]
    data = pm.rpoisson(lambda_)
    plt.bar(np.arange(80), data,color="#348ABD")
    plt.bar(tau-1, data[tau - 1], color="r", label="user behavior changed")
    plt.xlabel("Time (days)")
    plt.ylabel("Text messages received")
    plt.title("Artificial dataset from simulating the model")
    plt.xlim(0, 80)
    plt.legend();

for i in range(4):
    plt.subplot(4, 1, i+1)
    plt.xlabel("Time (days)")
    plt.ylabel("Text messages received")
    plot_artificial_sms_dataset()

AB检测

AB test的关键是单因素改变分析, 通常统计的方法是假设检验进行后验分析, 贝叶斯则采用不用的方法.