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


17

При использовании тематического моделирования (скрытое распределение Дирихле) количество тем является входным параметром, который необходимо указать пользователю.

Мне кажется, что мы также должны предоставить набор кандидатских тем, по которым процесс Dirichlet должен сэмплировать? Правильно ли мое понимание? На практике, как настроить этот набор кандидатов?

Ответы:


21

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

Обновлено 28 января. Теперь я делаю вещи немного иначе, чем метод ниже. Смотрите мой текущий подход здесь: /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.
ВитошКа

Привет @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
Бен,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.