贝叶斯推理:一个更有趣的例子
系统中的某用户每天收发的文本信息的数目,都有记录。图-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
对于这种计数的数据,泊松随机变量是很恰当的建模工具。每天文本信息的计数 CiCi 记作:
意思是随机变量 CiCi 有泊松质量分布。
但是,λλ 的值如何确定呢?图-1可见,在观察的后期收发的信息更多。这相当于说,在观察期的某时间点,λλ 变大。(回忆一下,较大的 λλ 会将较大输出值对应的概率加大。因此,如果某一天发出了许多信息,那么,这一天对应的概率会比较大。)
对此,我们如何用数学表示这一观察呢?假定在观察期(记作 ττ)内,参数 λλ 突然跳增。于是,我们就有了两个 λλ ,一个适用于 ττ 之前,另一个适用于其余期间。这种突变俗称关节点变化:
现实中,如果数据没有突然改变,并且确实 λ1=λ2λ1=λ2 ,那么,λλ 的后验分布应该相等。
我们感兴趣的是未知的 λλ 。要用贝叶斯推理,我们需要对λλ 不同的值赋予相应的先验概率。对于 λ1和 λ2λ1和 λ2 ,怎样的先验概率是适当的?已知 λλ 可为任意正数,而指数分布有连续密度函数处理正数,所以,该函数可能是计算 λiλi 的适当选择 。不过,指数分布有自己的参数,我们需要把它纳入我们的运算。我们把这个参数称作 αα 。
αα 叫做超参数或父参数,字面的意思是它可以影响其他参数。估计 αα 不会对运算有太大的影响,我们有些灵活的选择。在运算中,我们不想对这个参数过于执着。我建议把它设置成数据样本平均值的倒数。为什么这样做?因为我们使用指数分布计算 λλ ,可以得到如前所述的预期值:
使用这个数值,我们不再执着于先验分布,并且大大降低了超级参数的影响。我建议用两个先验分布对应每个 λiλi。以不同的 αα 值创建两个指数分布,表示我们的先验信念在观察期间某时间点的变化。
ττ 是怎么回事?由于数据有噪声,当 ττ 发生时,难以取得先验概率。于是,我们为每一天给以统一的先验概率:
那么,对于未知变量,我们总的先验分布看上去是什么样的呢?坦率地说,这无关紧要。应当理解的是,它丑陋、杂乱,用到的符号只有数学家喜欢。并且,如果我们的模型越复杂,所看到的分布越丑陋。幸好,我们关心的全是后验分布。