【问题标题】:stan - difficulty vectorizingstan - 难以矢量化
【发布时间】:2017-10-20 13:16:58
【问题描述】:

我有:

mu_x - 一个 10x10 的实数值矩阵

ptype - 一个 10000 长的向量

sender_name_type - 一个 10000 长的向量

我想找出

的值

x_real - 一个 10000 长的向量

我目前拥有并且有效的代码是:

for(i in 1:N){
  if(x_available[i]){
    x_real[i]~normal(x[i],0.01);} else{
    x_real[i]~normal(mu_x[ptype[i],sender_name_type[i]],0.1);
  }
}

不过,我想对其进行矢量化。为此,我首先需要处理 if 子句。为此,我尝试添加两个发行版,如下所示:

x_real ~ normal(mu_x[ptype,sender_name_type],0.1) * (1-x_avaiable) + normal(x,0.01) * x_available;

但是,Rstan 似乎无法处理加法/乘法分布。我尝试的第二种方法是这样的:

x_real ~ normal(mu_x[ptype,sender_name_type],0.1);
x_real[x_available == 1] ~ normal(x,0.01);

这类似于第一种方法,但它重新定义了满足条件的 x_real 的行。但是,它给了我

的错误

没有匹配项:

real[] ~ normal(matrix, real)

如果可能,我如何矢量化我当前的解决方案?还有其他方法可以加快速度吗?

【问题讨论】:

    标签: r stan rstan


    【解决方案1】:

    当您使用多个索引(如 [ptype,sender_name_type])时,Stan 语言不会变平。 Stan 语言也不支持按逻辑条件进行索引,例如[x_available == 1]

    执行此类操作的方法是循环设置参数,然后一步评估可能性以避免不必要的内存分配。在你的情况下,它看起来像

    vector[N] x_hat;
    vector[N] noise;
    for (i in 1:N) {
      x_hat[i] = x_available[i] ? x[i] : mu_x[ptype[i],sender_name_type[i]];
      noise[i] = x_available[i] ? 0.01 : 0.1;
    }
    target += normal_lpdf(x_real | x_hat, noise);
    

    【讨论】:

    • 谢谢,这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2018-06-11
    • 2021-12-15
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多