代码之家  ›  专栏  ›  技术社区  ›  jbuddy_13

在Stan中不可能将矩阵/向量乘以标量值吗?

  •  0
  • jbuddy_13  · 技术社区  · 4 年前

    考虑下面的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] 。虽然这确实通过了“scrub”,但由于维度不匹配,它在编译时会被拒绝。

    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);   
      }
    }
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Dharman Aman Gojariya    4 年前

    要按向量的对应值缩放矩阵的每一行,可以使用 diag_pre_multiply() ,所以会是 diag_pre_multiply(days, B) .days需要按以下方式读取 vector[N] days 而不是真实的。

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