贝叶斯景象

一、理论篇

总所周知,概率界分为两大学派,一是频率派,二是贝叶斯派。如果用一句话来陈述它们的核心区别,我倾向于这样讲,“频率派:概率是事件在长时间内发生的频率;贝叶斯派:概率可以解释为我们对一件事情发生的相信程度(信心)。”,通俗来讲,前者需大量的事件,看发生的次数,后者针对某一件事,我们对它发不发生有多大的信心。

这周在学习贝叶斯,正好还看了点吴军的《数学之美》,前几章大多涉及到贝叶斯、马尔科夫链在翻译、语音识别等方向的应用,深入浅出,看得真是不亦乐乎。

话不多说,上公式:

贝叶斯公式

这就是大名鼎鼎的贝叶斯公式。

P(A):什么都不知道,发生A的概率。通常称为先验概率。

P(A|X):在已知X发生的前提下,发生A的概率。我们已经有了X的证据了,再来推断A发生的概率,通常称为后验概率。

有什么用呢?

先验和后验,可以说就是贝叶斯的核心所在了。

举个例子吧,通常来讲,一个班级学生的成绩符合正态分布,这个“正态分布”就是先验:我什么数据、样本、证据都没有,我不清楚班上有多少人、不清楚哪怕其中一个人的成绩,得出的事件A。

正态分布有两个参数,平均数u和标准差std,我们知道一个班的成绩符合正态分布,但是是一个怎样的正态分布就不知道了。于是我们需要样本---各个学生的成绩,事件X,在有了X的情况下,我们获得的事件A才有意义。这个明确参数的“正态分布”就是后验:不仅知道它是正态分布,而且知道它是怎样的一个正态分布,得出事件P(A|X),在X的条件下A的情况。

这也符合我们日常的思考逻辑:在信息缺少的情况下,先估摸着得到一个模子,然后不断的从外界获取信息,打磨之前的模子,信息获得的越多越准,模子自然就越精美。

再举个生动点的例子,假如我们现在想对两个参数为lambda1,lambda2的泊松分布进行估计(记住:我们的目的是估计lambda),一开始我们什么都不知道,假设两种情况(两种先验):一、lambda符合均匀分布;二、lambda符合指数分布,下图图一(1)、图一(2)是先验概率的直观图,颜色越深代表概率越大(越有可能发生),显然平均分布在整个空间上每处的概率一致,处处颜色相等,指数分布在靠近0的位置颜色要深些。

上面是先验,搞定了。为弄后验,我们需要样本,就自己生成些样本罢:因为有两个参数lambda1,lambda2,要成两组样本,第一组样本A1由lambda1=1的泊松分布随机生成,第二组样本A2由lambda2=3的泊松分布随机生成。

有了A1,A2两组样本,我们就可以用他们来估计lambda1,lambda2了(事先我们是不知道A1,A2两组样本是符合lambda1=1,lambda2=3的泊松分布的,在这里为了模拟,用它来生成模拟数据A1,A2的)。

从直观图可以看出,当样本数N=1时,对原来的先验空间产生影响,估计值处在真实值lambda1=1,lambda2=3的很大一篇范围内,也就是说,一个样本不足以估计lambda。

贝叶斯景象_第1张图片
图一,样本数N=1

N=5,可以看出,估计值在(1,3)这个真实值点的估计范围在缩小。

贝叶斯景象_第2张图片
图二,样本数N=5

N=20,50就更小了,这个时候可以估计真实值大概在(1,3)附近

贝叶斯景象_第3张图片
图三,样本数N=20
贝叶斯景象_第4张图片
图四,样本数N=50

N=100,有了100组样本点,可以说基本就敢断定真实值就在(1,3)了


贝叶斯景象_第5张图片
图五,样本数N=100

总结:

先验为均匀分布或指数分布,但参数不可知。可通过一系列的样本,来不断的估计参数值,得到后验。

二、应用篇

import scipy.stats as stats

import numpy as np

from IPython.core.pylabtools import figsize

from matplotlib import pyplot as plt

from matplotlib.pyplot import jet

plt.rcParams['font.sans-serif']=['SimHei']#解约matplotlib画图,中文乱码问题

N=100#样本数

#为产生模拟数据的参数

lambda_1_true = 1

lambda_2_true = 3

#产生poisson分布的两组样本,参数分别是lambda_1_true,lambda_2_true

data = np.concatenate([

stats.poisson.rvs(lambda_1_true,size=(N,1)),

stats.poisson.rvs(lambda_2_true,size=(N,1))

],axis=1)

# print (data)

x = y = np.linspace(.01,5,100)

#pmf:概率质量函数,代表某个点符合poisson的概率大小

likelihood_x =np.array([stats.poisson.pmf(data[:,0],_x)

for _x inx]).prod(axis=1)

likelihood_y =np.array([stats.poisson.pmf(data[:,1],_y)

for _y iny]).prod(axis=1)

L =np.dot(likelihood_x[:,None],likelihood_y[None,:])

# print(likelihood_x)

# print(likelihood_y)

figsize(12.5,12)

#pdf:概率密度函数,在x,y上分别生成两组均匀分布的概率密度

uni_x = stats.uniform.pdf(x,loc=0,scale=5)

uni_y = stats.uniform.pdf(y,loc=0,scale=5)

Mu = np.dot(uni_x[:,None],uni_y[None,:])

#pdf:概率密度函数,在x,y上分别生成两组指数分布的概率密度

exp_x = stats.expon.pdf(x,loc=0,scale=3)

exp_y = stats.expon.pdf(y,loc=0,scale=10)

Me = np.dot(exp_x[:,None],exp_y[None,:])

#第一个图:均分分布

plt.subplot(221)

im = plt.imshow(Mu, interpolation='none',origin='lower', vmax=1, vmin=-.15, extent=(0,5,0,5))

plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')

plt.xlim(0,5)

plt.ylim(0,5)

plt.title('(1)均匀分布,先验概率直观图')

#第二个图:参数为lambda的poisson分布,lambda为均匀分布

plt.subplot(223)

plt.contour(x, y, Mu*L)

im = plt.imshow(Mu*L, interpolation='none',origin='lower', extent=(0,5,0,5))

plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')

plt.xlim(0,5)

plt.ylim(0,5)

plt.title('(3)均匀分布,后验概率直观图')

#第三个图:指数分布

plt.subplot(222)

plt.contour(x, y, Me)

im = plt.imshow(Me, interpolation='none',origin='lower', extent=(0,5,0,5))

plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')

plt.xlim(0,5)

plt.ylim(0,5)

plt.title('(2)指数分布,先验概率直观图')

#第三个图:参数为lambda的poisson分布,lambda为指数分布

plt.subplot(224)

plt.contour(x, y, Me*L)

im = plt.imshow(Me*L, interpolation='none',origin='lower', extent=(0,5,0,5))

plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')

plt.xlim(0,5)

plt.ylim(0,5)

plt.title('(4)指数分布,后验概率直观图')

plt.set_cmap('jet')

plt.show()

参考:《贝叶斯方法-概率编程与贝叶斯推断》

你可能感兴趣的:(贝叶斯景象)