我有一个加权贝叶斯逻辑回归模型
weighted_stan_representation = """
data {
int<lower=0> n; // number of observations
int<lower=0> d; // number of predictors
array[n] int<lower=0,upper=1> y; // outputs
matrix[n,d] x; // inputs
vector<lower=0>[n] w; // coreset weights
}
parameters {
vector[d] theta; // auxiliary parameter
}
model {
theta ~ normal(0, 1);
target += w*bernoulli_logit_lpmf(y| x*theta);
}
"""
数据如下:
{'x': array([[-1.92220908, -0.86248914],
[-0.64517094, 0.40222473],
[-0.71675321, -1.2782317 ],
...,
[-2.0448459 , -0.11735602],
[-0.9622542 , -2.27172399],
[-1.09545494, -0.83435958]]),
'y': array([0, 0, 0, ..., 0, 0, 0]),
'w': array([1., 1., 1., ..., 1., 1., 1.]),
'd': 2,
'n': 10000}
我可以从完整的后验中获取样本,即通过运行将权重统一为 1
posterior = stan.build(model.weighted_stan_representation, data = full_data, random_seed = 100000)
fit = posterior.sample(num_chains = num_chains, num_samples = num_samples, num_warmup = num_warmup)
然后我想使用一个稀疏的权重向量,并从近似的稀疏后验样本中使用
coreset_posterior = stan.build(model.weighted_stan_representation, data = sparse_data)
coreset_samples = coreset_posterior.sample(num_chains = num_chains, num_samples = num_samples, num_warmup = num_warmup)
但是,当我访问示例时,它们在两种情况下是完全等价的。我相信它与第一次调用 stan.build 时缓存的模型有关,因此实际上没有采集任何新样本。这是因为我得到了这个输出
Building: found in cache, done.
当我运行第二个 stan 表示时。这是我第一次使用 PyStan,我不知道如何解决这个问题。据我所知,似乎没有强制 PyStan 重新编译的选项。
任何帮助,将不胜感激!
我已经安装了最新版本的 Python 和 PyStan。