Как выбрать строки из двух матриц и умножить их - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь провести l oop по строкам в двух матрицах и умножить их, но каждая попытка приводит к появлению первой ошибки ниже, которая очевидна, и второй ошибки несоответствия размеров из последних двух попыток. Я попытался изменить формат извлеченных строк на форму, приемлемую для stan, но я не знаю, как привести их к соответствующему формату. Как мне выбрать строки и умножить их, пожалуйста?

СИНТАКСИЧЕСКАЯ ОШИБКА, СООБЩЕНИЕ ОТ ПАРСЕРА:
Нет совпадений для:
row_vector * row_vector

Выражение плохо сформирован.


16:       for(i in 1:Ns) {
17: //        yh[i, n] = xnew[n]* beta[i];
18:         yh[i, n] = xnew[n]* beta[i, ];
                                        ^
19: //        yh[i, n] = xnew[n]* row(beta, i);

Мой rstan код

library("rstan") 
txt <- 
  'data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;

    for(n in 1:N) {
      for(i in 1:Ns) {
//        yh[i, n] = xnew[n]* beta[i];
          yh[i, n] = xnew[n]* beta[i, ];
//        yh[i, n] = xnew[n]* row(beta, i);
//        yh[i, n] = xnew[n,]* row(beta, i);
//        yh[i, n] = to_vector(row(xnew, n))* to_matrix(row(beta, i));
//        yh[i, n] = to_vector(row(xnew, n))* row(beta, i);         
      }  
    }
  }

'
stan_model(model_code=txt) 

Для ясности это то, что я пытаюсь сделать на базе R

set.seed(1)
Ns=10; N=2; K=3
beta = matrix(rnorm(Ns*K), ncol=K)
xnew = matrix(rnorm(N*K), ncol=K)

yh=matrix(nr=Ns, nc=N)
for(n in 1:N) {
  for(i in 1:Ns) {
    p = as.numeric(xnew[n, , drop=FALSE] %*% beta[i,])
    yh[i, n] = p
  }  
}

#tcrossprod(beta, xnew)

РЕДАКТИРОВАТЬ:

Кажется, это делает трюк:

yh[i, n] = dot_product(row(xnew, n), row(beta, i));

Но есть ли способ рассчитать это, не проходя по каждой строке? (Я ничего не вижу в https://mc-stan.org/docs/2_18/functions-reference/dot-products-and-specialized-products.html)

1 Ответ

0 голосов
/ 11 марта 2020

Ну, я написал песню и потанцую над этим ... но вы можете просто использовать матричное умножение: yh = beta* xnew';

Итак, полный код:

txt <- 
  "data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;
    yh = beta* xnew';
  }

"

fit <- stan(model_code=txt,  data = list(beta=beta, xnew=xnew, Ns=10, N=2, K=3 ),    
            chains = 1, seed = 1, iter=1, algorithm = "Fixed_param")

ex_samp = as.matrix(fit)
all.equal(yh, matrix(ex_samp[-length(ex_samp)], nc=2))

Соответствующие документы: https://mc-stan.org/docs/2_18/functions-reference/matrix-arithmetic-operators.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...