- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否可以在 PyMC3 中定义一个自定义先验(以及如何做)。来自 here似乎在 PyMC2 中相对容易做到(无需修改源代码),但在 PyMC3 中就没那么容易了(或者我不理解某些东西)。我正在尝试从 BUGS 中实现的“做贝叶斯数据分析”一书中复制一个先验:
model {
# Likelihood. Each flip is Bernoulli.
for ( i in 1 : N1 ) { y1[i] ̃ dbern( theta1 ) }
for ( i in 1 : N2 ) { y2[i] ̃ dbern( theta2 ) }
# Prior. Curved scallo not ps!
x ̃ dunif(0,1)
y ̃ dunif(0,1)
N <- 4
xt <- sin( 2*3.141593*N * x ) / (2*3.141593*N) + x
yt <- 3 * y + (1/3)
xtt <- pow( xt , yt )
theta1 <- xtt
theta2 <- y
}
先验没有太大意义,只是举例说明如何定义自定义先验和BUGS的通用性。
我尝试实现上述自定义先验是:
from __future__ import division
import numpy as np
import pymc as pm
from pymc import Continuous
from theano.tensor import sin, log
# Generate the data
y1 = np.array([1, 1, 1, 1, 1, 0, 0]) # 5 heads and 2 tails
y2 = np.array([1, 1, 0, 0, 0, 0, 0]) # 2 heads and 5 tails
class Custom_prior(Continuous):
"""
custom prior
"""
def __init__(self, y, *args, **kwargs):
super(Custom_prior, self).__init__(*args, **kwargs)
self.y = y
self.N = 4
self.mean = 0.625 # FIXME
def logp(self, value):
N = self.N
y = self.y
return -log((sin(2*3.141593*N * value)
/ (2*3.141593*N) + value)**(3 * y + (1/3)))
with pm.Model() as model:
theta2 = pm.Uniform('theta2', 0, 1) # prior
theta1 = Custom_prior('theta1', theta2) # prior
# define the likelihood
y1 = pm.Bernoulli('y1', p=theta1, observed=y1)
y2 = pm.Bernoulli('y2', p=theta2, observed=y2)
# Generate a MCMC chain
start = pm.find_MAP() # Find starting value by optimization
trace = pm.sample(5000, pm.NUTS(), progressbar=False)
编辑
按照chris-fonnesbeck的回答
我想我需要这样的东西:
with pm.Model() as model:
theta2 = pm.Uniform('theta2', 0, 1) # prior
N = 4
theta1 = pm.DensityDist('theta1', lambda value: -log((sin(2*3.141593*N * value)
/ (2*3.141593*N) + value)**(3 * theta2 + (1/3))))
# define the likelihood
y1 = pm.Bernoulli('y1', p=theta1, observed=y1)
y2 = pm.Bernoulli('y2', p=theta2, observed=y2)
# Generate a MCMC chain
start = pm.find_MAP() # Find starting value by optimization
trace = pm.sample(10000, pm.NUTS(), progressbar=False) # Use NUTS sampling
唯一的问题是我对 theta1 和 theta2 的所有后验样本都得到了相同的值,我想我的自定义先验或先验和似然的组合存在一些问题。可以在此 example 中找到自定义先验的成功定义。
最佳答案
你能发布完整的 BUGS 模型吗?上面看起来只是BUGS中对x和y先验后的一系列确定性变换,而不是先验的定义。
假设上面的 logp
是您想要的,您可以在 PyMC 中更简单地实现它,如下所示:
def logp(value, y):
N = 4
return -log((sin(2*3.141593*N * value)
/ (2*3.141593*N) + value)**(3 * y + (1/3)))
theta1 = pm.DensityDist('theta1', logp, value, y=theta2)
关于python - 如何在 PyMC3 中定义自定义先验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24709627/
我想创建一组参数用于 R 中的 brms 模型: library(brms) tmp <- prior(normal(10,2), nlpar = "x") 理想情况下,我想从导入的矩阵中提取每个先验
我想在 PyMC3 中指定大型多元正态分布作为先验。该分布的精度矩阵的行列式在数值上等于零。看来这是 PyMC3 的问题。有什么建议么?我只需要最大化后验,无论行列式的值如何,都可以这样做。 最佳答案
(未在 Activator 文档中找到) 通过在文件 build.sbt 中添加以下条目(粗体),似乎可以让 Activator 也使用现有的本地 Maven 存储库: 解析器 += Seq( 位于“
我之前实现了原始的 Bayesian Probabilistic Matrix Factorization (BPMF) pymc3 中的模型。 See my previous question供引用
我是一名优秀的程序员,十分优秀!