PyMC在其当前可用版本中如何适合用于连续发射HMM建模?
我对建立一个框架很感兴趣,在该框架中我可以轻松探索模型的变化,而不必更新E步骤和M步骤,并且无需为每次对模型所做的更改进行动态编程递归。
更具体的问题是:
如果您认为PyMC在我的用例中不是一个很好的选择,那肯定也可以作为答案。
在PyMC2中,有方法random()和value()来生成随机值,并获得随机变量的当前值.有没有办法在PyMC3中做同样的事情?
p = pm.Dirichlet('p', theta=np.array([1., 1., 1.]))
p.random()
p.value
Run Code Online (Sandbox Code Playgroud) 如何使用pymc参数化概率图形模型?
假设我有两个节点的PGM X和Y.让我们说X->Y是图表.
并且X采用两个值{0,1},并且
Y还采用两个值{0,1}.
我想使用pymc来学习分布的参数,并用它来填充图形模型以进行推理.
我能想到的方式如下:
X_p = pm.Uniform("X_p", 0, 1)
X = pm.Bernoulli("X", X_p, values=X_Vals, observed=True)
Y0_p = pm.Uniform("Y0_p", 0, 1)
Y0 = pm.Bernoulli("Y0", Y0_p, values=Y0Vals, observed=True)
Y1_p = pm.Uniform("Y1_p", 0, 1)
Y1 = pm.Bernoulli("Y1", Y1_p, values=Y1Vals, observed=True)
Run Code Online (Sandbox Code Playgroud)
这里Y0Vals是Y对应于X值= 0 Y1Vals的值,并且是Y对应于X值= 1的值.
计划是从这些中抽取MCMC样本,并使用Y0_p和Y1_p
填充离散贝叶斯网络的概率...所以概率表适用P(X) = (X_p,1-X_p)于P(Y/X):
Y 0 …Run Code Online (Sandbox Code Playgroud) 在这里,我的目的是估算由下式给出的阻尼谐波振荡器的参数(伽马和ω)
dX ^ 2 / dt ^ 2 +γ* dX / dt +(2 * pi * omega)^ 2 * X = 0。(我们可以向系统中添加高斯白噪声。)
import pymc
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt;
from scipy.integrate import odeint
#import data
xdata = sio.loadmat('T.mat')['T'][0] #time
ydata1 = sio.loadmat('V1.mat')['V1'][0] # V2=dV1/dt, (X=V1),
ydata2 = sio.loadmat('V2.mat')['V2'][0] # dV2/dt=-(2pi*omega)^2*V1-gama*V2
#time span for solving the equations
npts= 500
dt=0.01
Tspan=5.0
time = np.linspace(0,Tspan,npts+1)
#initial condition
V0 = [1.0, 1.0]
# Priors for unknown …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个自定义的Theano Op,它在数值上集成了两个值之间的函数.Op是PyMC3的自定义可能性,涉及一些积分的数值计算.我不能简单地使用@as_op装饰器,因为我需要使用HMC来执行MCMC步骤.任何帮助将不胜感激,因为这个问题似乎已经走到了好几次,但一直没有得到解决(如/sf/ask/2579711081/,Theano:实现一个积分函数).
显然,一种解决方案是在Theano中编写一个数值积分器,但是当非常好的积分器已经可用时,这似乎是浪费精力,例如通过scipy.integrate.
为了保持这个最小的例子,让我们尝试在Op中集成0到1之间的函数.以下在Op之外集成了Theano函数,并且在我的测试已经消失的情况下产生了正确的结果.
import theano
import theano.tensor as tt
from scipy.integrate import quad
x = tt.dscalar('x')
y = x**4 # integrand
f = theano.function([x], y)
print f(0)
print f(1)
ans = integrate.quad(f, 0, 1)[0]
print ans
Run Code Online (Sandbox Code Playgroud)
但是,尝试在Op中进行集成似乎要困难得多.我目前的最大努力是:
import numpy as np
import theano
import theano.tensor as tt
from scipy import integrate
class IntOp(theano.Op):
__props__ = ()
def make_node(self, x):
x = tt.as_tensor_variable(x)
return theano.Apply(self, [x], [x.type()])
def perform(self, node, inputs, output_storage):
x = inputs[0]
z …Run Code Online (Sandbox Code Playgroud) 我试图掌握Bayesain统计数据 pymc3
我运行此代码进行简单的线性回归
#Generating data y=a+bx
import pymc3
import numpy as np
N=1000
alpha,beta, sigma = 2.0, 0.5, 1.0
np.random.seed(47)
X = np.linspace(0, 1, N)
Y = alpha + beta*X + np.random.randn(N)*sigma
#Fitting
linear_model = pymc3.Model()
with linear_model:
alpha = pymc3.Normal('alpha', mu=0, sd=10)
beta = pymc3.Normal('beta', mu=0, sd=10)
sigma = pymc3.HalfNormal('sigma', sd=1)
mu = alpha + beta*X
Y_obs = pymc3.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
start = pymc3.find_MAP(fmin=optimize.fmin_powell)
step = pymc3.NUTS(scaling=start)
trace = pymc3.sample(500, step, start=start)
Run Code Online (Sandbox Code Playgroud)
我不明白跟踪代表什么
如果我理解的贝叶斯理论不够好,有应该是一个belief即得功能alpha, …
我有一组数据,其中有每个点的平均值、标准差和观察次数(即,我了解有关测量准确性的知识)。在传统的 pymc3 模型中,我只关注方法,我可能会做以下事情:
x = data['mean']
with pm.Model() as m:
a = pm.Normal('a', mu=0, sd=1)
b = pm.Normal('b', mu=1, sd=1)
y = a + b*x
eps= pm.HalfNormal('eps', sd=1)
likelihood = pm.Normal('likelihood', mu=y, sd=eps, observed=x)
Run Code Online (Sandbox Code Playgroud)
将有关观测方差的信息纳入模型的最佳方法是什么?显然,结果应该对低方差观测值赋予比高方差(不太确定)观测值更大的权重。
统计学家建议的一种方法是执行以下操作:
x = data['mean'] # mean of observation
x_sd = data['sd'] # sd of observation
x_n = data['n'] # of measures for observation
x_sem = x_sd/np.sqrt(x_n)
with pm.Model() as m:
a = pm.Normal('a', mu=0, sd=1)
b = pm.Normal('b', mu=1, sd=1)
y = a + b*x …Run Code Online (Sandbox Code Playgroud) 我试图通过Python工作从Osvaldo Martin的贝叶斯分析中获取PyMC3示例.在Windows 10上,使用matplotlib的以下代码工作正常(即显示图表):
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
def posterior_grid(grid_points=100, heads=6, tosses=9):
"""
A grid implementation for the coin-flip problem
"""
grid = np.linspace(0, 1, grid_points)
prior = 0.5 - abs(grid - 0.5)
likelihood = stats.binom.pmf(heads, tosses, grid)
unstd_posterior = likelihood * prior
posterior = unstd_posterior / unstd_posterior.sum()
return grid, posterior
if __name__ == "__main__":
points = 100
h, n = 1, 4
grid, posterior = posterior_grid(points, h, n) …Run Code Online (Sandbox Code Playgroud) 我正在使用黑客贝叶斯方法的线性回归示例,但无法将其扩展到我的用途。
我对一个随机变量进行了观察,对该随机变量进行了假设分布,最后对我观察到的该随机变量进行了另一个假设分布。a我如何尝试使用和上的中间分布对其进行建模b,但它抱怨Wrong number of dimensions: expected 0, got 1 with shape (788,).
为了描述实际模型,我预测一定数量 (n) 的培养电子邮件的转化率。我的先前观点是,转化率(由 和 上的 Beta 函数描述alpha)将通过某些因子 (0,inf]和beta进行更新alpha和缩放,这些因子从 n=0 的 1 开始,并在某个阈值处增加到最大值。betaab
# Generate predictive data, X and target data, Y
data = [
{'n': 0 , 'trials': 120, 'successes': 1},
{'n': 5 , 'trials': 111, 'successes': 2},
{'n': 10, 'trials': 78 , 'successes': 1},
{'n': 15, 'trials': 144, 'successes': 3},
{'n': …Run Code Online (Sandbox Code Playgroud) 我尝试将其安装在单独的环境中并arviz单独安装。是import pymc3 as pm行不通的。
AttributeError: module 'arviz' has no attribute 'geweke'
Run Code Online (Sandbox Code Playgroud) pymc3 ×10
python ×7
pymc ×5
bayesian ×2
matplotlib ×1
mcmc ×1
porting ×1
probability ×1
statistics ×1
theano ×1