考虑下面的 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 列,使其成为一个矩阵并可用于矩阵乘法。但这真的有必要吗?应该很容易通过标量值“缩放”矩阵。
错误是:
编辑:我还将天数转换为矩阵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/