首页 > 解决方案 > PyMC3:多元正态下的回归

问题描述

我最近开始学习pymc3,我想预测多元正态模型。有 N 组 M 个连续数据,我想根据观察到的数据 x_ob 和 y_ob 预测每组的参数 a、b 及其相关性。我假设x和y是双曲线关系,参数a和b是相关的并且是正态分布的。

这是我到目前为止所拥有的。

#  Generate data
np.random.seed(10)
N = 10
M = 5
idx = np.arange(N*M)//M
x_ob = np.arange(N*M)%M+1
a,b = 1,2.5
ro = 0.7
s1,s2=0.1,0.1
cov = [[s1**2,ro*s1*s2],[ro*s1*s2,s2**2]]
ax,bx = np.random.multivariate_normal([a,b],cov,N).T
noise = np.random.normal(1,0.05,N*M)

def func(x,a,b):
    return a*x/(x+b)

y_ob = func(x_ob, ax[idx], bx[idx])*noise

# MCMC
with pm.Model() as model:
    # model
    ab0 = pm.Uniform('ab0', lower=0, upper=5, shape=2)
    sd  = pm.Uniform("sd",lower=0,upper=1, shape=2)
    rh  = pm.Uniform("rh",lower=-1,upper=1)
    cov = pm.Deterministic("cov", pm.math.stack(([sd[0]**2,sd[0]*sd[1]*rh],[sd[0]*sd[1]*rh,sd[1]**2])))

    ab  = pm.MvNormal('ab', mu=ab0, cov=cov, shape=(N,2))    
    a = ab[:,0]
    b = ab[:,1]
    
    # error
    eps_cv = pm.Uniform('eps', lower=0, upper=1)

    # observation
    y0= func(x_ob,a[idx], b[idx])
    y = pm.Normal('y',  mu=y0 , sd=eps_cv*y0, observed=y_ob)
    
    prior_samples = pm.sample_prior_predictive(100)
pm.model_to_graphviz(model)

这会引发错误:Bad input argument to theano function with name "C:\Users\user\Anaconda3\envs\pymc\lib\site-packages\pymc3\distributions\distribution.py:431" at index 0 (0-based )。维数错误:预期为 1,得到 2,形状为 (100, 2)。

由于我发现 sample_prior_predictive["ab"] 包括 NAN,我认为 ab 的形状是错误的,但我不知道。我应该怎么做?

提前致谢。

标签: pythonbayesianpymc3

解决方案


推荐阅读