第一次使用PyMC3的用户尝试将模块用于贝叶斯非线性回归。给定输入输出数据(x_i,y_i),建模假设为
在模型参数 w 中,函数f为非线性。因此,
为简单起见,假设 ,并独立采样所有样本,以使联合可能性等于各个可能性的乘积。
目标:计算模型参数 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]
显然,测试运行是可行的(如打印语句所示),但是对马尔可夫链的模拟却没有。