PRML:二元变量分布
伯努利分布
考虑二元随机变量
其中 Bernoulli distribution
),其概率分布可以写成:
均值和方差为:
伯努利分布的最大似然估计
考虑一组
对数似然为
对数似然值只依赖于
对
即最大似然估计值为样本均值(sample mean
),若样本中
考虑抛三次硬币出现了三次正面的情况,此时
为了解决这个问题,我们可以考虑引入先验知识。
二项分布
给定数据总数 binomial distribution
)。
从伯努利分布的似然函数中可以看出它应该正比于
其中
是组合数。
验证它是一个概率分布,二项式定理给出:
例如下面
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
%matplotlib inline
from scipy.stats import binom
n = 20
mu = 0.6
X = binom.rvs(n, mu, size=10000)
fig, ax = plt.subplots()
ax.hist(X, bins=range(21), rwidth=0.7)
ax.set_xlabel("$m$", fontsize='x-large')
# ax.set_xlim(0, 21)
# ax.set_yticks(np.arange(0, 0.31, 0.1))
# ax.set_xticks(np.arange(0.5, 10.6, 1))
# ax.set_xticklabels(range(21))
ax.set_title(r'$N = 20, \mu=0.6$', fontsize='x-large')
plt.show()
计算均值时考虑下式对
beta 分布
之前看到,当数据量较少时,最大似然的结果很可能会过拟合。为了减少这样的情况,从 Bayes 概率的观点出发,我们引入一个关于
我们观察到似然函数是一系列 conjugacy
)。
在这里,我们引入的是 beta
分布:
其中:
满足如下性质:
验证它是一个概率分布:
由定义
令
交换积分次序,原来
令
于是我们有:
其均值和方差为
求均值:
从归一化我们知道:
从而,利用
类似可以得到:
从而可以计算出方差。
from scipy.stats import beta
fig, axes = plt.subplots(2, 2,figsize=(10, 7))
axes = axes.flatten()
A = (0.1, 1, 2, 8)
B = (0.1, 1, 3, 4)
xx = np.linspace(0, 1, 100)
for a, b, ax in zip(A, B, axes):
yy = beta.pdf(xx, a, b)
ax.plot(xx, yy, 'r')
ax.set_ylim(0, 3)
ax.set_xticks([0, 0.5, 1])
ax.set_xticklabels(["$0$", "$0.5$", "$1$"], fontsize="large")
ax.set_yticks([0, 1, 2, 3])
ax.set_yticklabels(["$0$", "$1$", "$2$", "$3$"], fontsize="large")
ax.set_xlabel("$\mu$", fontsize="x-large")
ax.text(0.1, 2.5, r"$a={}$".format(a), fontsize="x-large")
ax.text(0.1, 2.2, r"$b={}$".format(b), fontsize="x-large")
有了先验分布,我们的后验分布为
其中
由共轭性,我们知道后验分布还是一个 beta
分布,从而有
至此,我们看到,如果我们观测到了一组
更进一步,当有新的数据到来时,后验概率可以看成新的先验概率,因此这个过程可以序列化进行。下图表示观测到一个新的
xx = np.linspace(0, 1, 100)
fig, axes = plt.subplots(1, 3, figsize=(10, 2))
axes = axes.flatten()
axes[0].plot(xx, beta.pdf(xx, 2, 2), 'r')
axes[0].set_ylim(0, 2)
axes[0].text(0.1, 1.6, "prior", fontsize="x-large")
axes[0].set_xlabel("$\mu$", fontsize="x-large")
axes[0].set_xticks([0, 0.5, 1])
axes[0].set_yticks([0, 1, 2])
axes[1].plot(xx, xx)
axes[1].set_ylim(0, 2)
axes[1].text(0.1, 1.6, "likelihood", fontsize="x-large")
axes[1].set_xlabel("$\mu$", fontsize="x-large")
axes[1].set_xticks([0, 0.5, 1])
axes[1].set_yticks([0, 1, 2])
axes[2].plot(xx, beta.pdf(xx, 3, 2), 'r')
axes[2].set_ylim(0, 2)
axes[2].text(0.1, 1.6, "posterior", fontsize="x-large")
axes[2].set_xlabel("$\mu$", fontsize="x-large")
axes[2].set_xticks([0, 0.5, 1])
axes[2].set_yticks([0, 1, 2])
plt.show()
如果我们的目的是预测下一次实验的结果,那么我们有
而我们知道后验概率的分布,所以可以计算出其均值:
当
即趋向于最大似然的解。当
另外我们观察到,随着
另外考虑条件期望和方差的性质,我们有:
和
从而我们知道,从平均意义上来说,后验分布的方差要比先验分布的方差要小。后验分布在数据分布上的均值等于先验分布的均值
推荐阅读
-
Flink之DataSet语义注释、广播变量、分布式缓存及参数传递
-
PRML:二元变量分布
-
The Dirichlet Distribution 狄利克雷分布 (PRML 2.2.1)
-
The Dirichlet Distribution 狄利克雷分布 (PRML 2.2.1)
-
关于利用均匀分布随机变量产生任意分布变量的实现
-
随机变量函数的分布: PHP常用函数之is_var():检测是否合法变量名
-
Python学习-Scipy库统计操作(随机变量、概率密度、累积分布密度、期望、方差、描述性统计(最大最小值、均值、方差、偏差、峰度)、核密度估计)
-
随机变量的概率分布学习笔记
-
随机变量函数的分布: PHP常用函数之is_var():检测是否合法变量名
-
统计 | 几种特殊随机变量的分布