pymc 的后验概率
Posterior probability with pymc
(这个问题最初是在 stats.O 上发布的。我把它移到这里是因为它确实与 pymc
和其中更一般的问题有关:事实上,主要目的是为了更好地理解pymc
的工作原理。如果任何版主认为它不适合 SO,我将从这里删除。)
我一直在阅读 pymc tutorial 以及此处和 SO 中的许多其他问题。
我正在尝试了解如何应用贝叶斯定理 来计算使用某些数据的后验概率。特别是,我有一个独立参数的元组
根据数据,我想推断 的可能性,其中 是特定事件。那么目标就是计算
一些补充意见:
- 这是一种无监督学习,我知道发生了,我想找出使概率最大化的参数。 (*)
- 我还想有一个并行过程,让
pymc
计算给定数据的可能性,然后 为每个参数元组 我想得到后验概率。
在下文中,我将假设 并且可能性是具有 的 multi-dimensional 正态分布(由于独立性)。
以下是我正在使用的代码(为简单起见,假设只有两个参数)。代码仍在开发中(我知道它行不通!)。但我相信包含它是有用的,然后根据评论和答案对其进行完善,以提供一个框架供将来参考。
class ObsData(object):
def __init__(self, params):
self.theta1 = params[0]
self.theta2 = params[1]
class Model(object):
def __init__(self, data):
# Priors
self.theta1 = pm.Uniform('theta1', 0, 100)
self.theta2 = pm.Normal('theta2', 0, 0.0001)
@pm.deterministic
def model(
theta1=self.theta1,
theta2=self.theta2,
):
return (theta1, theta2)
# Is this the actual likelihood?
self.likelihood = pm.MvNormal(
'likelihood',
mu=model,
tau=np.identity(2),
value=data, # is it correct to put the data here?
observed=True
)
def mcmc(observed_data):
data = ObsData(observed_data)
pymc_obj = Model(data)
model = pymc.MCMC(pymc_obj)
model.sample(10000, verbose=0) # Does this line compute the likelihood and the normalisation factor?
# How do I get the posterior distribution?
问题如下:
self.likelihood
是否表示贝叶斯似然?
- 如何使用这些数据? (我怀疑
value=data
不正确..)
.sample()
真的会计算后验概率吗?
- 如何从后验获取信息?
- (*)我是否应该包括与 在某个时刻发生的事实相关的任何内容?
- 作为一般性问题:是否可以使用
pymc
仅计算给定数据和先验的可能性?
欢迎任何意见,也欢迎参考其他问题或教程!
对于初学者,我认为您想从您的模型定义中 return (theta1*theta2)。
model.sample 是采样,而不是计算,给定数据后参数的后验分布(假设有足够的老化等),并且可以确定每个参数元组的特定值的可能性取样后的关节后部。
我认为您目前对 MCMC 有一些根本性的误解。我想不出比向您指出精彩 Bayesian Methods for Hackers
更好的方式来回答您的问题
(这个问题最初是在 stats.O 上发布的。我把它移到这里是因为它确实与 pymc
和其中更一般的问题有关:事实上,主要目的是为了更好地理解pymc
的工作原理。如果任何版主认为它不适合 SO,我将从这里删除。)
我一直在阅读 pymc tutorial 以及此处和 SO 中的许多其他问题。
我正在尝试了解如何应用贝叶斯定理 来计算使用某些数据的后验概率。特别是,我有一个独立参数的元组
根据数据,我想推断 的可能性,其中 是特定事件。那么目标就是计算
一些补充意见:
- 这是一种无监督学习,我知道发生了,我想找出使概率最大化的参数。 (*)
- 我还想有一个并行过程,让
pymc
计算给定数据的可能性,然后 为每个参数元组 我想得到后验概率。
在下文中,我将假设 并且可能性是具有 的 multi-dimensional 正态分布(由于独立性)。
以下是我正在使用的代码(为简单起见,假设只有两个参数)。代码仍在开发中(我知道它行不通!)。但我相信包含它是有用的,然后根据评论和答案对其进行完善,以提供一个框架供将来参考。
class ObsData(object):
def __init__(self, params):
self.theta1 = params[0]
self.theta2 = params[1]
class Model(object):
def __init__(self, data):
# Priors
self.theta1 = pm.Uniform('theta1', 0, 100)
self.theta2 = pm.Normal('theta2', 0, 0.0001)
@pm.deterministic
def model(
theta1=self.theta1,
theta2=self.theta2,
):
return (theta1, theta2)
# Is this the actual likelihood?
self.likelihood = pm.MvNormal(
'likelihood',
mu=model,
tau=np.identity(2),
value=data, # is it correct to put the data here?
observed=True
)
def mcmc(observed_data):
data = ObsData(observed_data)
pymc_obj = Model(data)
model = pymc.MCMC(pymc_obj)
model.sample(10000, verbose=0) # Does this line compute the likelihood and the normalisation factor?
# How do I get the posterior distribution?
问题如下:
self.likelihood
是否表示贝叶斯似然?- 如何使用这些数据? (我怀疑
value=data
不正确..) .sample()
真的会计算后验概率吗?- 如何从后验获取信息?
- (*)我是否应该包括与 在某个时刻发生的事实相关的任何内容?
- 作为一般性问题:是否可以使用
pymc
仅计算给定数据和先验的可能性?
欢迎任何意见,也欢迎参考其他问题或教程!
对于初学者,我认为您想从您的模型定义中 return (theta1*theta2)。
model.sample 是采样,而不是计算,给定数据后参数的后验分布(假设有足够的老化等),并且可以确定每个参数元组的特定值的可能性取样后的关节后部。
我认为您目前对 MCMC 有一些根本性的误解。我想不出比向您指出精彩 Bayesian Methods for Hackers
更好的方式来回答您的问题