Вхідні параметри для використання прихованого розподілу Діріхле


17

Під час використання моделювання тем (Latent Dirichlet Allocation) кількість тем є вхідним параметром, який потрібно вказати користувачеві.

Мені здається, що ми також повинні запропонувати збірку наборів тем кандидатів, проти яких повинен діяти процес Діріхле? Чи правильно я розумію? На практиці, як налаштувати такий тип набору кандидатів?

Відповіді:


21

Наскільки я знаю, вам просто потрібно подати ряд тем та корпусу. Не потрібно вказувати набір тем для кандидатів, хоча їх можна використовувати, як ви бачите в прикладі, починаючи внизу сторінки 15 Grun and Hornik (2011) .

Оновлено 28 січня 14. Зараз я все роблю дещо інакше, ніж описано нижче. Дивіться тут про мій поточний підхід: /programming//a/21394092/1036500

Порівняно простий спосіб знайти оптимальну кількість тем без даних про навчання - це перегортання моделей з різною кількістю тем, щоб знайти кількість тем з максимальною вірогідністю журналу, враховуючи дані. Розглянемо цей приклад сR

# download and install one of the two R packages for LDA, see a discussion
# of them here: http://stats.stackexchange.com/questions/24441
#
install.packages("topicmodels")
library(topicmodels)
#
# get some of the example data that's bundled with the package
#
data("AssociatedPress", package = "topicmodels")

Перш ніж правильно перейти до створення теми теми та аналізу результатів, нам потрібно визначитися з кількістю тем, які модель повинна використовувати. Ось функція для переходу на різні номери тем, отримання життєздатності журналу моделі для кожного номера теми та побудови її, щоб ми могли вибрати найкращу. Найкраща кількість тем - це найвища величина ймовірності журналу для отримання прикладних даних, вбудованих у пакет. Тут я вирішив оцінити кожну модель, починаючи з 2 тем, хоча до 100 тем (це займе певний час!).

best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})

Тепер ми можемо витягнути значення життєздатності журналу для кожної створеної моделі та підготуватися до її побудови:

best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))

best.model.logLik.df <- data.frame(topics=c(2:100), LL=as.numeric(as.matrix(best.model.logLik)))

А тепер складіть сюжет, щоб побачити, у якій кількості тем з’являється найвища ймовірність журналу:

library(ggplot2)
ggplot(best.model.logLik.df, aes(x=topics, y=LL)) + 
  xlab("Number of topics") + ylab("Log likelihood of the model") + 
  geom_line() + 
  theme_bw()  + 
  opts(axis.title.x = theme_text(vjust = -0.25, size = 14)) + 
  opts(axis.title.y = theme_text(size = 14, angle=90))

введіть тут опис зображення

Схоже, це десь між 10 і 20 темами. Ми можемо перевірити дані, щоб знайти точну кількість тем із найвищою швидкістю журналу:

best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
       topics        LL
12     13           -8525.234

Отже, результат 13 тем, що найкраще відповідають цим даним. Тепер ми можемо продовжувати розробку моделі LDA з 13 темами та дослідження моделі:

lda_AP <- LDA(AssociatedPress[21:30,], 13)   # generate the model with 13 topics 
get_terms(lda_AP, 5)                         # gets 5 keywords for each topic, just for a quick look
get_topics(lda_AP, 5)                        # gets 5 topic numbers per document

І так далі, щоб визначити атрибути моделі.

Цей підхід базується на:

Griffiths, TL, M. Steyvers 2004. Пошук наукових тем. Праці Національної академії наук Сполучених Штатів Америки 101 (Suppl 1): 5228 –5235.


Я оновив код для цього і зберег у вигляді суті. має метод сюжету, який друкує за замовчуванням. devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1 приємна відповідь.
Тайлер Рінкер

Збільшуючи k в LDA, ви розширюєте простір параметрів, а моделі з меншим k по суті вкладаються всередині моделей з вищим k. Тож LL має постійно зростати з k. Те, що у вас трапляється з невеликим ударом навколо k = 13, ймовірно, пов'язано з тим, що алгоритм VEM не збігається до глобального максимуму для складних моделей. У вас буде більше удачі з AIC або BIC.
VitoshKa

Привіт @Ben, дуже корисна відповідь. У мене є одне питання про це, коли ви оцінюєте модель з 2-100 тема: best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)}). Чому ви вибираєте лише рядки 21:30 даних?
Economist_Ayahuasca

Оскільки я кілька років тому опублікував цю відповідь, я не можу точно згадати. Але, мабуть, просто, щоб час обчислення не було коротким!
Бен

1
Тепер є цей гарний кілограм для обчислення оптимальної кількості тем: cran.r-project.org/web/packages/ldatuning
Ben
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.