r - 在 Stan 中是否不可能将矩阵/向量乘以标量值?

标签 r matrix-multiplication bayesian stan

考虑下面的 Stan 脚本,我通过 RStan 使用它:

data {
  int K; //outcome classes
  int N; //rows
  int D; //input dimensions
  int y[N];
  matrix[N, D] X;
  real days[N]; 
}
parameters {
  matrix[D, K] C;
  matrix[D, K] B;
}
model {
  matrix[N, K] pred = X*C + days*X*B; //If I remove days, it works fine. 

  to_vector(pred) ~ normal(0, 5);

  for (n in 1:N)
    y[n] ~ categorical_logit(pred[n]');
}

一个不理想的解决方案是复制 R 中的 days 列,使其成为一个矩阵并可用于矩阵乘法。但这真的有必要吗?应该很容易通过标量值“缩放”矩阵。

错误是:

enter image description here

编辑:我还将天数转换为矩阵matrix[N,1] days[N]。虽然这确实通过了“清理”,但由于维度不匹配,它在编译时被拒绝。

Edit2:我已经调整了代码,现在可以执行。但我很困惑为什么这个嵌套 for 循环是必要的。应该有一种简单的方法将所有向量元素乘以相同的标量值。

data {
  int K; //outcome classes, 3
  int N; //num rows
  int D; //input dimensions, 5
  int Y[N];
  matrix[N,D] X;
  int days[N]; 
}
parameters {
  matrix[D, K] C; //[5,3] 
  matrix[D, K] B; //[5,3]
}
model {
  for (n in 1:N){
    vector[K] pred;
    vector[D] ipt;
    matrix[K,K] day_diag;
    for (i in 1:K){
      for (j in 1:K){
        if (i == j)
          day_diag[i,j] = days[n];
        else
          day_diag[i,j] = 0; 
      }
    }
    
    ipt = X[n]'; // now row_vector [1xD]
    // [D,K] x [1,D] + [D,K] x [1,D]  
    pred = C * ipt   +  B * (day_diag * ipt); 
    Y[n]~categorical_logit(pred);   
  }
}

最佳答案

要将矩阵的每一行缩放为对应的向量值,您可以使用 diag_pre_multiply(),因此它将是 diag_pre_multiply(days, B)。天数需要被读入向量[N]天而不是真实的。

顺便说一句,Stan 定义了大量矩阵运算,请参阅:https://mc-stan.org/docs/2_25/functions-reference/matrix-operations.html

关于r - 在 Stan 中是否不可能将矩阵/向量乘以标量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64451127/

相关文章:

r - 如何使用 R 中的 apply 将字符串粘贴到字符串向量的每个元素上?

r - 在 R 中按条件堆叠多列

r - 根据具有特定(非字母)顺序的字符列对 data.table 进行排序

python - GPyOpt 的 "First Step"示例应该找到最小值吗?

algorithm - MCMC 的随机排列

r - 在 R 中编辑函数有哪些方法?

c++ - 通过外部分配的数据调用 Eigen GEMM

c - 矩阵乘法与 mpi

c - 在 C 中将两个 3x3 矩阵相乘

r - 朴素贝叶斯分类器的文档术语矩阵 : unexpected results R