У меня есть обработка данных:
library(text2vec)
##Using perplexity for hold out set
t1 <- Sys.time()
perplex <- c()
for (i in 3:25){
set.seed(17)
lda_model2 <- LDA$new(n_topics = i)
doc_topic_distr2 <- lda_model2$fit_transform(x = dtm, progressbar = F)
set.seed(17)
sample.dtm2 <- itoken(rawsample$Abstract,
preprocessor = prep_fun,
tokenizer = tok_fun,
ids = rawsample$id,
progressbar = F) %>%
create_dtm(vectorizer,vtype = "dgTMatrix", progressbar = FALSE)
set.seed(17)
new_doc_topic_distr2 <- lda_model2$transform(sample.dtm2, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
perplex[i] <- text2vec::perplexity(sample.dtm2, topic_word_distribution =
lda_model2$topic_word_distribution,
doc_topic_distribution = new_doc_topic_distr2)
}
print(difftime(Sys.time(), t1, units = 'sec'))
Я знаю, что есть много подобных вопросов, но я не смог точно найти ответ на свою ситуацию. Выше вы видите вычисление растерянности от 3 до 25 номеров тем для модели скрытого распределения Дирихле. Я хочу получить наиболее достаточное значение среди тех, что означает, что я хочу найти колено или колено, для тех значений, которые можно рассматривать только как простой числовой вектор, результат которого выглядит следующим образом:
1 NA
2 NA
3 222.6229
4 210.3442
5 200.1335
6 190.3143
7 180.4195
8 174.2634
9 166.2670
10 159.7535
11 153.7785
12 148.1623
13 144.1554
14 141.8250
15 138.8301
16 134.4956
17 131.0745
18 128.8941
19 125.8468
20 123.8477
21 120.5155
22 118.4426
23 116.4619
24 113.2401
25 114.1233
plot(perplex)
Вот так выглядит график
Я бы сказал, что локоть будет 13 или 16, но я не совсем уверен и хочу получить точное число в качестве результата. Я видел в этой статье , что f '' (x) / (1 + f '(x) ^ 2) ^ 1.5 - это формула колена, которую я попробовал вот так, и говорит, что это 18:
> d1 <- diff(perplex) # first derivative
> d2 <- diff(d1) / diff(perplex[-1]) # second derivative
> knee <- (d2)/((1+(d1)^2)^1.5)
Warning message:
In (d2)/((1 + (d1)^2)^1.5) :
longer object length is not a multiple of shorter object length
> which.min(knee)
[1] 18
Я не могу полностью понять это. Кто-нибудь хотел бы поделиться, как я мог получить точное идеальное количество тем в зависимости от недоумения в качестве результата?