如何将 PyStan 对象存储为二进制文件?
How to store PyStan object as a binary?
我想将使用 Stan 的概率编程步骤中的中间文件(例如 fit
对象,请参阅下面的 SWE)存储到一个文件中,以便稍后加载它以备后用。 Stan 用 C++ 编译模型,在每次 运行 之后,我不想再重新 运行 模型,我想将它们存储到文件系统以供以后分析。
使用 PyStan 存储 Stan 对象的最佳方式是什么?换句话说,我如何将 stan 对象存储为二进制文件以及存储结果的最可行方法是什么,这样以后就不需要再 运行 它们了?
小型工作示例(来源here)
schools_code = """
data {
int<lower=0> J; // number of schools
real y[J]; // estimated treatment effects
real<lower=0> sigma[J]; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] = mu + tau * eta[j];
}
model {
eta ~ normal(0, 1);
y ~ normal(theta, sigma);
}
"""
schools_dat = {'J': 8,
'y': [28, 8, -3, 7, -1, 1, 18, 12],
'sigma': [15, 10, 16, 11, 9, 11, 10, 18]}
sm = pystan.StanModel(model_code=schools_code)
fit = sm.sampling(data=schools_dat, iter=1000, chains=4)
您有几个选择...其中最好的是 pickle
import pickle
with open('fit.pkl', 'wb') as pickle_out:
pickle.dump(fit, pickle_out)
另一个选项是 pandas ...但是虽然这保留了样本,但它不再是 StanFit4Model 对象。
import pandas as pd
fit.to_dataframe().to_csv(‘fit.csv’, encoding='utf-8')
我想将使用 Stan 的概率编程步骤中的中间文件(例如 fit
对象,请参阅下面的 SWE)存储到一个文件中,以便稍后加载它以备后用。 Stan 用 C++ 编译模型,在每次 运行 之后,我不想再重新 运行 模型,我想将它们存储到文件系统以供以后分析。
使用 PyStan 存储 Stan 对象的最佳方式是什么?换句话说,我如何将 stan 对象存储为二进制文件以及存储结果的最可行方法是什么,这样以后就不需要再 运行 它们了?
小型工作示例(来源here)
schools_code = """
data {
int<lower=0> J; // number of schools
real y[J]; // estimated treatment effects
real<lower=0> sigma[J]; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] = mu + tau * eta[j];
}
model {
eta ~ normal(0, 1);
y ~ normal(theta, sigma);
}
"""
schools_dat = {'J': 8,
'y': [28, 8, -3, 7, -1, 1, 18, 12],
'sigma': [15, 10, 16, 11, 9, 11, 10, 18]}
sm = pystan.StanModel(model_code=schools_code)
fit = sm.sampling(data=schools_dat, iter=1000, chains=4)
您有几个选择...其中最好的是 pickle
import pickle
with open('fit.pkl', 'wb') as pickle_out:
pickle.dump(fit, pickle_out)
另一个选项是 pandas ...但是虽然这保留了样本,但它不再是 StanFit4Model 对象。
import pandas as pd
fit.to_dataframe().to_csv(‘fit.csv’, encoding='utf-8')