PyMC3的贝叶斯非线性回归

时间:2018-09-05 10:50:17

标签: bayesian pymc3 non-linear-regression

第一次使用PyMC3的用户尝试将模块用于贝叶斯非线性回归。给定输入输出数据(x_i,y_i),建模假设为

enter image description here

在模型参数 w 中,函数f为非线性。因此,

enter image description here

为简单起见,假设 enter image description here,并独立采样所有样本,以使联合可能性等于各个可能性的乘积。

目标:计算模型参数 w 的后验概率。

第一步,我需要定义每个x_i给我期望值的函数。

@as_op(itypes=[tt.dscalar]*5, otypes=[tt.dvector])
def compute_expected_value(eta, rho, lamd, vbar, v0):

    model_param = [[eta, rho, lamd, vbar, v0]]

    # Expected value of outcome
    model_param = np.tile(model_param, (len(df), 1))
    features = np.column_stack((model_param, df.maturity, df.strike))  
    features = standardise_inputs(features, train_mean, train_std)
    exp_value, _ = predict(features, nn, sess)

    return exp_value.reshape(-1)

给出一个具有数据和模型参数w =(eta,rho,lambda,vbar,v0)的数据框,将输入标准化,然后输入到使用Tensorflow编码的神经网络中(这在predict中被抽象化了)功能)。然后,我尝试尽可能地遵循 Linear 回归 tutorial

def build_model():

    with basic_model as model:

        # Uniform priors for unknown model parameters
        eta = pm.Uniform('eta', lower=0, upper=5)
        rho = pm.Uniform('rho', lower=-1, upper=0)
        lamd = pm.Uniform('lambda',lower=0, upper=10)
        vbar = pm.Uniform('vbar', lower=0, upper=1)
        v0 = pm.Uniform('v0', lower=0, upper=1)

        sigma = pm.HalfNormal('sigma', sd=1)

        # Returns a (1337,) numpy vector for the expected value
        print('Compute NN IV.')
        mean = compute_expected_value(eta, rho, lamd, vbar, v0)
        print('NN IV computed.')

        # Likelihood (sampling distribution) of observations
        Y_obs = pm.Normal('Y_obs', mu=mean, sd=sigma, observed=df.iv.values)

    return model

def run(n=500):
    model = build_model()
    with model:
        db = pm.backends.Text('test')
        trace = pm.sample(n, step=pm.Metropolis(), trace=db)

    pm.traceplot(trace)

正如@merv指出的那样,NUTS不可用,因为该软件包无法从我的神经网络Tensorflow实现中获取梯度,因此我尝试使用Metropolis。但是,这返回:

Compute NN IV.
NN IV computed.
Multiprocess sampling (2 chains in 2 jobs)
CompoundStep
>Metropolis: [sigma]
>Metropolis: [v0]
>Metropolis: [vbar]
>Metropolis: [lambda]
>Metropolis: [rho]
>Metropolis: [eta]
Sampling 2 chains:   0%|          | 0/2000 [00:00<?, ?draws/s]

显然,测试运行是可行的(如打印语句所示),但是对马尔可夫链的模拟却没有。

  1. 为什么MCMC无法运行?
  2. 就像在 tutorial中一样,我传递一个数组而不是 mu 的标量,这是正确的吗?

0 个答案:

没有答案