贝叶斯推理:一个更有趣的例子
系统中的某用户每天收发的文本信息的数目,都有记录。图-1画出了这些数据。你想了解该用户收发信息的习惯在此期间的变化,是逐渐的还是突然的。你将如何解决问题?
%matplotlib inline
from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt
import scipy.stats as stats
figsize(12.5, 3.5)
count_data = np.loadtxt("data/txtdata.csv")
n_count_data = len(count_data)
plt.bar(np.arange(n_count_data), count_data, color="#348ABD")
plt.xlabel("Time (days)")
plt.ylabel("Text messages received")
plt.title("Did the user’s texting habits change over time?")
plt.xlim(0, n_count_data);
图-1
对于这种计数的数据,泊松随机变量是很恰当的建模工具。每天文本信息的计数
Ci
C
i
记作:
意思是随机变量 Ci C i 有泊松质量分布。
但是, λ λ 的值如何确定呢?图-1可见,在观察的后期收发的信息更多。这相当于说,在观察期的某时间点, λ λ 变大。(回忆一下,较大的 λ λ 会将较大输出值对应的概率加大。因此,如果某一天发出了许多信息,那么,这一天对应的概率会比较大。)
对此,我们如何用数学表示这一观察呢?假定在观察期(记作
τ
τ
)内,参数
λ
λ
突然跳增。于是,我们就有了两个
λ
λ
,一个适用于
τ
τ
之前,另一个适用于其余期间。这种突变俗称关节点变化:
现实中,如果数据没有突然改变,并且确实 λ1=λ2 λ 1 = λ 2 ,那么, λ λ 的后验分布应该相等。
我们感兴趣的是未知的
λ
λ
。要用贝叶斯推理,我们需要对
λ
λ
不同的值赋予相应的先验概率。对于
λ1和 λ2
λ
1
和
λ
2
,怎样的先验概率是适当的?已知
λ
λ
可为任意正数,而指数分布有连续密度函数处理正数,所以,该函数可能是计算
λi
λ
i
的适当选择 。不过,指数分布有自己的参数,我们需要把它纳入我们的运算。我们把这个参数称作
α
α
。
α α 叫做超参数或父参数,字面的意思是它可以影响其他参数。估计 α α 不会对运算有太大的影响,我们有些灵活的选择。在运算中,我们不想对这个参数过于执着。我建议把它设置成数据样本平均值的倒数。为什么这样做?因为我们使用指数分布计算 λ λ ,可以得到如前所述的预期值:
使用这个数值,我们不再执着于先验分布,并且大大降低了超级参数的影响。我建议用两个先验分布对应每个 λi λ i 。以不同的 α α 值创建两个指数分布,表示我们的先验信念在观察期间某时间点的变化。
τ
τ
是怎么回事?由于数据有噪声,当
τ
τ
发生时,难以取得先验概率。于是,我们为每一天给以统一的先验概率:
那么,对于未知变量,我们总的先验分布看上去是什么样的呢?坦率地说,这无关紧要。应当理解的是,它丑陋、杂乱,用到的符号只有数学家喜欢。并且,如果我们的模型越复杂,所看到的分布越丑陋。幸好,我们关心的全是后验分布。