我的问题涉及贝叶斯推理以及如何在给定一些数据以及先验和后验分布的情况下数值计算模型证据。
给定共轭先验,wikipedia article指定模型证据如下:
其中sigma和beta是参数,m是模型,Y是数据,X是先验。
鉴于以下设置,我如何计算模型证据?我需要一些返回一个标量数字的东西。
下面我有一个最小的工作示例,即生成一些数据(从法线绘制)并假设先验(正常)和似然函数(高斯)。注意数据的PDF和先前的数据如何整合到(大约)一个,而似然函数可以取值超过1。
我很担心如何整合"来自模型的参数,因此考虑了模型复杂性。如果你能记下对数似然函数,我可以看到如何分析完成这个。但是,我们真的不知道这会如何产生一个标量数字。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import scipy
import seaborn as sns
sns.set(style="white", palette="muted", color_codes=True)
%matplotlib inline
mu = 0
variance = 1
sigma = np.sqrt(variance)
data = np.random.normal(mu,variance,100)
x = np.linspace(-5,5,100)
density = scipy.stats.kde.gaussian_kde(data)
data_pdf = density(x)
prior_pdf = scipy.stats.norm.pdf(x, mu, sigma)
likelihood = np.exp(-np.power(x - mu, 2.) / (2 * np.power(sigma, 2.)))
I1=scipy.integrate.trapz(data_pdf,x)
I2=scipy.integrate.trapz(prior_pdf,x)
I3=scipy.integrate.trapz(likelihood,x)
fig1 = plt.figure(figsize=(7.5,5))
ax1 = fig1.add_subplot(3,1,1)
sns.despine(right=True)
ax1.plot(x,data_pdf,'k')
ax1.legend([r'$PDF(Data)$'],loc='upper left')
ax2 = fig1.add_subplot(3,1,2)
sns.despine(right=True)
ax2.plot(x,prior_pdf,'b')
ax2.legend([r'$Prior$'],loc='upper left')
ax3 = fig1.add_subplot(3,1,3)
sns.despine(right=True)
ax3.plot(x,likelihood,'r')
ax3.legend([r'$Likelihood$'],loc='upper left')
plt.tight_layout()
print(I1,I2,I3)