0

我有一个加权贝叶斯逻辑回归模型

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。

4

0 回答 0