stan - 向量化难度
stan - difficulty vectorizing
我有:
mu_x - a 10x10 matrix of real values
ptype - a 10000 long vector
sender_name_type - a 10000 long vector
我想找到
的值
x_real - a 10000 long vector
我目前拥有且有效的代码是:
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 似乎无法处理 adding/multiplying 发行版。我尝试的第二种方法是这样的:
x_real ~ normal(mu_x[ptype,sender_name_type],0.1);
x_real[x_available == 1] ~ normal(x,0.01);
与第一种方式类似,只是重新定义了x_real中满足条件的行。但是,它给了我
的错误
No matches for:
real[] ~ normal(matrix, real)
如果可能,如何矢量化我当前的解决方案?还有其他方法可以加快速度吗?
当您使用 [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);
我有:
mu_x - a 10x10 matrix of real values
ptype - a 10000 long vector
sender_name_type - a 10000 long vector
我想找到
的值x_real - a 10000 long vector
我目前拥有且有效的代码是:
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 似乎无法处理 adding/multiplying 发行版。我尝试的第二种方法是这样的:
x_real ~ normal(mu_x[ptype,sender_name_type],0.1);
x_real[x_available == 1] ~ normal(x,0.01);
与第一种方式类似,只是重新定义了x_real中满足条件的行。但是,它给了我
的错误No matches for:
real[] ~ normal(matrix, real)
如果可能,如何矢量化我当前的解决方案?还有其他方法可以加快速度吗?
当您使用 [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);