Я пишу код алгоритма моделирования тем 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 ) )
}