在 Stan 中不可能将 matrices/vectors 乘以标量值吗?
Is it impossible to multiply matrices/vectors by scalar values in Stan?
考虑以下我通过 RStan 使用的 Stan 脚本:
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 中的天数列,使其成为一个矩阵并可用于矩阵乘法。但这真的有必要吗?通过标量值“缩放”矩阵应该很容易。
错误是:
编辑:我还将天数转换为矩阵 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)
。 days 需要读入 vector[N] days
而不是真实的。
顺便说一句,Stan 定义了大量矩阵运算,请参阅:https://mc-stan.org/docs/2_25/functions-reference/matrix-operations.html
考虑以下我通过 RStan 使用的 Stan 脚本:
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 中的天数列,使其成为一个矩阵并可用于矩阵乘法。但这真的有必要吗?通过标量值“缩放”矩阵应该很容易。
错误是:
编辑:我还将天数转换为矩阵 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)
。 days 需要读入 vector[N] days
而不是真实的。
顺便说一句,Stan 定义了大量矩阵运算,请参阅:https://mc-stan.org/docs/2_25/functions-reference/matrix-operations.html