Применяя «which.max» или любую другую функцию к каждой ячейке в матрице в R - PullRequest
0 голосов
/ 29 февраля 2020

Я перепробовал все предложения, доступные онлайн, но ни одно из них не привело к желаемому результату.

Вот мой код:

usualviterbi <- function(x, Pi, delta, emission) {
  n <- length(x)
  m <- nrow(Pi)
  nu <- log(matrix(0, nrow = n, ncol = m))
  phi <-  matrix(0, nrow = n, ncol = m) 
  y <- rep(NA, n)
  #Initialisation
  nu[1, ] <- log(delta) + log(emission[1,])
  ########

  #Recursion
  if (n>1) {
    logPi <- log(Pi)
    for (i in 2:n) {
      matrixnu <- matrix(nu[i - 1, ], nrow = m, ncol = m)
      nu[i, ] <- apply(matrixnu + logPi, 2, max) + log(emission[i,])
      #phi[i,]= which.max(nu[i, ]) - log(emission[i,]) ###
      phi[i,]= apply(nu[,i, drop=FALSE] - log(emission[,i,drop=FALSE]) , c(1,2), which.max)
      #phi[i,]= data.frame(lapply(nu[i,] - log(emission[i,]), which.max))
    }
    #phi= apply(nu - log(emission), c(1,2), which.max)
    ########

    #Termination
    y[n] <- which.max(nu[n,])      #final phi
    final_nu <- max(nu[n,])     #final delta
    ######## 
    #Backtracking  
    for (i in seq(n - 1, 1, -1)) {  
      y[i] <- which.max(logPi[, y[i + 1]] + nu[i, ])
    }
  } else {
    y <- which.max(nu[n,])
  }   #termination 
  return(phi); 
  #return(nu); 
  #return(y)
}

x <- c(1,2,3,1)
Pi <- matrix(c(0.4,0.6,0.7,0.3),nrow=2, byrow=T)
delta <- c(0.2,0.8)
emission <- matrix(c(0.1,0.2,0,0.8,0.9,0,0.1,0.2), nrow=length(x), ncol=2, byrow=T)
usualviterbi(x, Pi, delta, emission)

В качестве вывода я хочу матрицу 4 * 2 phi, которая бы возвращала функцию which.max, примененную к каждой ячейке в матрице nu , В блоке рекурсии моего кода вы можете увидеть некоторые из моих попыток, но все они приводят к ошибкам вкл. необходимость положительной затемненной длины (обычная ошибка при apply f.).

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