先验信念

Python 中的贝叶斯数据分析

Michal Oleszak

Machine Learning Engineer

先验分布

  • 先验分布在观测数据前反映对参数的认识:
    • 无信息 → 均匀分布(所有值等可能)
    • 旧后验 → 可用新数据更新

 

  • 为纳入外部信息,可选任意概率分布作先验:
    • 专家意见
    • 常识
    • 既有研究
    • 主观信念
Python 中的贝叶斯数据分析

先验的影响

两条重叠的密度曲线:一条为先验,另一条为后验。先验为均匀分布,后验为略高的钟形。

两条重叠的密度曲线:一条为先验,另一条为后验。先验为均匀分布,后验为略高且右偏的钟形。

两条重叠的密度曲线:一条为先验,另一条为后验。先验为均匀分布,后验为更高的钟形。

两条重叠的密度曲线:一条为先验,另一条为后验。先验为均匀分布,后验为更高很多的钟形。

Python 中的贝叶斯数据分析

先验分布

  • 先验在看到数据前选定。
  • 先验选择会影响后验(尤其在数据很少时)。
  • 为避免"择优选取",先验应:
    • 清晰说明;
    • 可解释:基于既有研究、合理假设、专家意见等。
Python 中的贝叶斯数据分析

选择合适的先验

我们的先验:正面概率较低

呈钟形但左偏的密度图,峰值约在 0.25。

有的选择更优!

 

呈钟形但左偏的密度图,峰值约在 0.25,比前一图更窄。

Python 中的贝叶斯数据分析

共轭先验

  • 某些先验与特定似然相乘,会得到已知的后验。
  • 它们称为共轭先验
  • 抛硬币情形:
    • 若先验为 Beta(a, b),
    • 则后验为 Beta(#heads + a, #tosses - #heads + b)
  • 我们可用 numpy 从后验采样。
  • 第 1 章的 get_heads_prob()
    def get_heads_prob(tosses):
      num_heads = np.sum(tosses)
      # prior: Beta(1,1)
      return np.random.beta(num_heads + 1, len(tosses) - num_heads + 1, 1000)
    
Python 中的贝叶斯数据分析

获得后验的两种方法

模拟

  • 若后验已知,可用 numpy 采样:
    draws = np.random.beta(2, 4, 1000)
    
  • 结果:包含 1000 次后验抽样的数组:
    array([0.05941031, ..., 0.70015975])
    
  • 可用以下方式绘图:
    sns.kdeplot(draws)
    

计算

  • 若后验未知,可用网格逼近计算。
  • 结果:每个网格点的后验概率:
           head_prob  posterior_prob
    0           0.00        0.009901
    1           0.01        0.003624
               ...           ...
    10199       0.99        0.003624
    10200       1.00        0.009901
    
  • 可用以下方式绘图:
    sns.lineplot(df["head_prob"], df["posterior_prob"])
    
Python 中的贝叶斯数据分析

让我们练习先验吧!

Python 中的贝叶斯数据分析

Preparing Video For Download...