【问题标题】:Bayesian Inference with PyMC3. Compilation error.使用 PyMC3 进行贝叶斯推理。编译错误。
【发布时间】:2018-12-01 00:46:18
【问题描述】:

以下两个代码使用 PyMC3 在 python 中进行简单的贝叶斯推理。虽然指数模型的第一个代码编译并运行得非常好,但简单 ode 模型的第二个代码给出了错误。我不明白为什么一个工作,另一个不工作。请帮忙。

代码 #1

import numpy as np
import pymc3 as pm

def f(a,b,x,c):
    return a * np.exp(b*x)+c


#Generating Data with error
a, b = 5, 0.2
xdata = np.linspace(0, 10, 21)
ydata = f(a, b, xdata,0.5)
yerror = 5 * np.random.rand(len(xdata))
ydata += np.random.normal(0.0, np.sqrt(yerror))


model = pm.Model()
with model:
    alpha = pm.Uniform('alpha', lower=a/2, upper=2*a)
    beta = pm.Uniform('beta', lower=b/2, upper=2*b)
    mu = f(alpha, beta, xdata,0.5)
    Y_obs = pm.Normal('Y_obs', mu=mu, sd=yerror, observed=ydata)
    trace = pm.sample(100, tune = 50, nchains = 1)

代码 #2

import numpy as np
import pymc3 as pm


def solver(I, a, T, dt):
    """Solve u'=-a*u, u(0)=I, for t in (0,T] with steps of dt."""
    dt = float(dt)           # avoid integer division
    N = int(round(T/dt))     # no of time intervals
    print N
    T = N*dt                 # adjust T to fit time step dt
    u = np.zeros(N+1)           # array of u[n] values
    t = np.linspace(0, T, N+1)  # time mesh

    u[0] = I                 # assign initial condition
    for n in range(0, N):    # n=0,1,...,N-1
        u[n+1] = (1 - a*dt)*u[n]
    return np.ravel(u)

# Generating data
ydata = solver(1,1.7,10,0.1)
yerror = 5 * np.random.rand(101)
ydata += np.random.normal(0.0, np.sqrt(yerror))

model = pm.Model()
with model:
    alpha = pm.Uniform('alpha', lower = 1.0, upper = 2.5)

    mu = solver(1,alpha,10,0.1)

    Y_obs = pm.Normal('Y_obs', mu=mu, sd=yerror, observed=ydata)

    trace = pm.sample(100, nchains=1)

错误是

Traceback (most recent call last):
  File "1.py", line 27, in <module>
    mu = solver(1,alpha,10,0.1)
  File "1.py", line 16, in solver
    u[n+1] = (1 - a*dt)*u[n]
ValueError: setting an array element with a sequence.

请帮忙。

【问题讨论】:

  • 你想用代码#2做什么?

标签: python-2.7 compiler-errors pymc pymc3 hierarchical-bayesian


【解决方案1】:

错误在这一行:

mu = solver(1,alpha,10,0.1)

您试图将alpha 作为值传递,但alphapymc3 分布。函数solver 仅在您在第二个参数中提供数字时才有效。

代码 #1 有效,因为这个函数

def f(a,b,x,c):
    return a * np.exp(b*x)+c

返回一个数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多