как оптимизировать вложенный цикл в lda, код модели темы в r - PullRequest
0 голосов
/ 19 января 2019

Я пишу код алгоритма моделирования тем LDA. Я передал входные данные clean_corp, как показано в приведенном ниже коде, содержащем твиты. Выходные данные - матрица wt (слово-тема) и матрица dt (тема-документ). Все должно работать нормально, нопроблема в сложности времени. Когда я запускаю функцию LDA1 для 1000 итераций, для 300 твитов это занимает 15 минут. Я проверил сложность времени каждого цикла for, цикл, содержащий итерацию, занимал много времени.

 LDA1 <- function( clean_corp, vocab, K, alpha, eta, iterations,seed )
{
  set.seed(seed)
  length(clean_corp)
  wt <- matrix( 0, K, length(vocab) )
  colnames(wt) <- vocab
  ta <- lapply( unlist(clean_corp), function(x) rep( 0, length(x) ) ) 
  length(clean_corp)
  names(ta) <- paste0( "doc", 1:length(clean_corp) )
  len<-length(clean_corp)
  dt <- matrix( 0,len, K )
  system.time({
  for( d in 1:len )
  {
    var1<-0
    for( w in 1:length( clean_corp[[d]] ) )
    {
      var1<-sample( 1:K, 1 )
      ta[[d]][w]<-var1
      ti <-unlist(var1)
      wi <-unlist(clean_corp[[d]][w])
      wt[ ti, wi ] <- wt[ ti, wi ] + 1    
    }
    for( t in 1:K )  
      dt[ d, t ] <- sum( ta[[d]] == t ) 
  }
  })
  system.time({
    for( i in 1:iterations )
       {
     for( d in 1:length(clean_corp) )
     {
       for( w in 1:length( clean_corp[[d]] ) )
       {

        t0  <- ta[[d]][w]
        wid <- clean_corp[[d]][w]

        dt[d, t0 ]   <- dt[d, t0 ] - 1

        wt[t0, wid ] <- wt[t0, wid] - 1

        left  <- ( wt[ , wid ] + eta ) / ( rowSums(wt) + length(vocab) * eta )
        right <- ( dt[ d, ] + alpha ) / ( sum( dt[ d, ] ) + K * alpha )

        t1 <- sample( 1:K, 1, prob = left * right )
        ta[[d]][w] <- t1
        dt[ d, t1 ]   <- dt[ d, t1 ] + 1
        wt[ t1, wid ] <- wt[ t1, wid ] + 1
      }
     }
       }
 })
 return( list( wt = wt, dt = dt ) )
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...