Локоть / колено в кривой в R - PullRequest
0 голосов
/ 29 октября 2019

У меня есть обработка данных:

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

Я не могу полностью понять это. Кто-нибудь хотел бы поделиться, как я мог получить точное идеальное количество тем в зависимости от недоумения в качестве результата?

1 Ответ

0 голосов
/ 16 ноября 2019

Найдено это: «Модель LDA с оптимальной оценкой когерентности, полученная методом локтя (точка с максимальной абсолютной второй производной) (...)» в этой статье , так что это кодирование делаетработа: d1 <- diff(perplex); k <- which.max(abs(diff(d1) / diff(perplex[-1])))

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