pymc3:螺母取样、多层次模型、Wishart分布
我在pymc3的层次模型中遇到坚果采样问题。我在pymc3中做了一些简单的模型,没有任何问题,但是有了这个任务,我无法移动。有人能帮我吗 可以从以下位置获取数据:。首先,应对数据集进行一些工作:pymc3:螺母取样、多层次模型、Wishart分布,pymc3,Pymc3,我在pymc3的层次模型中遇到坚果采样问题。我在pymc3中做了一些简单的模型,没有任何问题,但是有了这个任务,我无法移动。有人能帮我吗 可以从以下位置获取数据:。首先,应对数据集进行一些工作: import numpy as np import pandas as pd import pymc3 as pm import theano.tensor as T data = pd.read_csv("cars2004.csv", sep=",", index_col= 0) interest
import numpy as np
import pandas as pd
import pymc3 as pm
import theano.tensor as T
data = pd.read_csv("cars2004.csv", sep=",", index_col= 0)
interest = ["price.retail", "cons.city", "cons.highway", "engine.size",
"horsepower","weight", "wheel.base", "length", "width", "ncylinder"]
df1 = data[data.ncylinder != -1]
df1 = df1[df1.fhybrid != "Yes"]
df = df1[interest].copy()
n, p = len(df), 9
df["price.retail"] = df["price.retail"].apply(lambda x: x/1000)
python中的模型:
with pm.Model() as model:
lambd = pm.Gamma("lambd", alpha=1, beta=.005)
beta0 = pm.Normal("beta0", mu = 80, sd = 100)
beta = pm.MvNormal("beta", mu = np.zeros(p), tau = lambd*np.eye(p), shape = p)
mu = pm.MvNormal("mu", mu = np.array([10,10,3,200,1500,250,500,10,5]),
cov = np.diag([100,100,100,1000**2,1000**2,100**2,100**2,100**2,100]),
shape=p)
sigmainvert = pm.WishartBartlett("sigmainvert", nu=p,S=.001*np.eye(p),
testval=.001*np.eye(p))
tau = pm.Gamma("tau", 1, .005)
#sigma = pm.Uniform("sigma", .1, 100)
X = pm.MvNormal("X", mu = mu, tau = sigmainvert, shape = (n,p),
observed = df[interest[1:]])
Y = pm.Normal("Y", mu = beta0 + T.dot(X, beta), tau = tau,
observed = df["price.retail"])
dev = pm.Deterministic("dev",-2*Y.logpt)
先验分布中的值是通过赋值得到的。“X”有一些缺失数据,“sigmainvert”应为Wishart(9,diag(0.001,…,0.001)
对螺母步骤和起始值应用ADVI(首先,我对NaN elbo和NaN值有一些问题,现在是elbo=-inf)。采样:
with model:
means, sds, elbo = pm.variational.advi(n=50000, learning_rate=0.1)
step = pm.NUTS(scaling = model.dict_to_array(sds)**2, is_cov=True)
trace = pm.sample(1000, step, start = means)
plot1 = pm.traceplot(trace, varnames=["beta0","beta","tau","mu","dev"],alpha=1)
记录道的结果图:。如您所见,未进行MCMC推断,记录道作为起始值是常量。使用Metropolis step对同一模型进行采样会生成“mu”跟踪常量和其他变量。问题出在哪里?我知道了。如果有人有类似的问题,请使用LKJ分布而不是Wishart。这篇文章对我帮助很大。