什么是贝叶斯理论?
贝叶斯理论就是允许我们根据抽样分布(或称似然度)和先验分布推导出后验分布。
什么是抽样分布?
抽样分布指的是在给定参数θ的条件下,X发生的概率。记做p(X|θ).
举例说明,我们记录了1000次抛硬币的数据。如果1表示硬币正面。可以用python这么表示:
输入 [2]:
1 2 3 |
import numpy as np data_coin_flips = np.random.randint(2, size=1000) np.mean(data_coin_flips) |
输出[2]:
0.46800000000000003
抽样分布允许我们指定数据的生成方式。对抛硬币来说,我们可以假设总体数据服从以 p 为参数的伯努利分布。这个参数 p 是抛出1的概率(抛硬币得到正面)。返回结果为1的概率p以及结果为0的概率(1-p)。
可以看出这种分布完美的切合抛硬币事件。如果硬币是均匀的情况下,我们知道p值为0.5,因为抛得1(正面)或0(反面)的机会是平均的。在python中我们可以通过下面两条语句创建这样的分布:
输入[3]:
1 2 |
bernoulli_flips = np.random.binomial(n=1, p=.5, size=1000) np.mean(bernoulli_flips) |
输出[3]:
0.46500000000000002
既然已经定义了我们所认为的数据生成方式,就可以根据给定参数来计算数据的似然概率P(X|θ)。 因为我们已经选定了伯努利分布,只需要一个参数p就可以了。
我们可以使用伯努利分布的概率质量函数(PMF)来计算单次抛硬币的期望概率。PMF根据一个数据值和给定的参数(本例中为p),返回相应的概率。对伯努利分布来说,这个pmf函数非常简单: 如果数据值为1, 那么它的概率返回p, 如果数据值为0, 那么返回概率为(1-p)。 我们可以定义如下函数:
In [4]:
1 2 3 4 5 6 7 |
def bern_pmf(x, p): if (x == 1): return p elif (x == 0): return 1 - p else: return "Value Not in Support of Distribution" |
现在我们使用这个函数,根据输入输参数来获取每个数据点的概率。如果参数p的值为0.5,那么返回值也总是0.5.
In [5]:
1 2 |
print(bern_pmf(1, .5)) print(bern_pmf(0, .5)) |
0.5
0.5
这是一种非常简单的 PMF,不过其他分布的 PMF 会复杂得多。所以呢,我们应该了解这个模块 Scipy,它将这些都作为内建函数,直接调用就可以了。像下面这样描述PMF:
In [6]:
1 2 3 |
import scipy.stats as st print(st.bernoulli.pmf(1, .5)) print(st.bernoulli.pmf(0, .5)) |
0.5
0.5
这个模块很给力,但是我们实际上想知道的是这1000个样本数据的总体概率。怎么才能知道呢?这里有个小技巧,假设我们的样本数据是独立同分布的。那么我们就可以简单的认为所有数据的概率就是每个个体的独立概率的乘积:
p(x1,…,xn|β)=p(x1|β)∗…∗p(xn|β)。Python中可以这样实现:
In [7]:
1 |
np.product(st.bernoulli.pmf(data_coin_flips, .5)) |
Out[7]:
9.3326361850321888e-302
得出这样的数据能做什么用呢? 说实话,单个数据本身其实并没有什么卵用。我们现在需要做的是给我们的抽样模型生成更多的分布。现在,我们仅仅使用概率0.5来测试我们的模型,如果概率为0.8呢? 或者0.2呢?我们数据的概率又会怎样?想要验证这些情况, 可以定义一个概率p 的网格。下面我将构造100个0到1之间的数据组成的网格(因为概率值都在0和1之间),之后呢,我会在这些值的基础上来计算我们抽样数据的概率。
In [8]:
1 2 3 4 5 6 7 8 |
import matplotlib.pyplot as plt n.org/github/tfolkman/learningwithdata/blob/master/Bayes_Primer.ipynb">nbviewer.ipython.org。欢迎加入翻译组。 什么是贝叶斯理论? 贝叶斯理论就是允许我们根据抽样分布(或称似然度)和先验分布推导出后验分布。 什么是抽样分布?抽样分布指的是在给定参数θ的条件下,X发生的概率。记做p(X|θ). 举例说明,我们记录了1000次抛硬币的数据。如果1表示硬币正面。可以用python这么表示: 输入 [2]:
输出[2]: 0.46800000000000003 抽样分布允许我们指定数据的生成方式。对抛硬币来说,我们可以假设总体数据服从以 p 为参数的伯努利分布。这个参数 p 是抛出1的概率(抛硬币得到正面)。返回结果为1的概率p以及结果为0的概率(1-p)。 可以看出这种分布完美的切合抛硬币事件。如果硬币是均匀的情况下,我们知道p值为0.5,因为抛得1(正面)或0(反面)的机会是平均的。在python中我们可以通过下面两条语句创建这样的分布: 输入[3]:
输出[3]: 0.46500000000000002 既然已经定义了我们所认为的数据生成方式,就可以根据给定参数来计算数据的似然概率P(X|θ)。 因为我们已经选定了伯努利分布,只需要一个参数p就可以了。 我们可以使用伯努利分布的概率质量函数(PMF)来计算单次抛硬币的期望概率。PMF根据一个数据值和给定的参数(本例中为p),返回相应的概率。对伯努利分布来说,这个pmf函数非常简单: 如果数据值为1, 那么它的概率返回p, 如果数据值为0, 那么返回概率为(1-p)。 我们可以定义如下函数: In [4]:
现在我们使用这个函数,根据输入输参数来获取每个数据点的概率。如果参数p的值为0.5,那么返回值也总是0.5. In [5]:
0.5 0.5 这是一种非常简单的 PMF,不过其他分布的 PMF 会复杂得多。所以呢,我们应该了解这个模块 Scipy,它将这些都作为内建函数,直接调用就可以了。像下面这样描述PMF: In [6]:
0.5 0.5 这个模块很给力,但是我们实际上想知道的是这1000个样本数据的总体概率。怎么才能知道呢?这里有个小技巧,假设我们的样本数据是独立同分布的。那么我们就可以简单的认为所有数据的概率就是每个个体的独立概率的乘积: p(x1,…,xn|β)=p(x1|β)∗…∗p(xn|β)。Python中可以这样实现: In [7]:
Out[7]: 9.3326361850321888e-302 得出这样的数据能做什么用呢? 说实话,单个数据本身其实并没有什么卵用。我们现在需要做的是给我们的抽样模型生成更多的分布。现在,我们仅仅使用概率0.5来测试我们的模型,如果概率为0.8呢? 或者0.2呢?我们数据的概率又会怎样?想要验证这些情况, 可以定义一个概率p 的网格。下面我将构造100个0到1之间的数据组成的网格(因为概率值都在0和1之间),之后呢,我会在这些值的基础上来计算我们抽样数据的概率。 In [8]:
|