잠재 된 디리클레 할당을 사용하기위한 입력 매개 변수


17

주제 모델링 (Latent Dirichlet Allocation)을 사용할 때 주제 수는 사용자가 지정해야하는 입력 매개 변수입니다.

Dirichlet 프로세스가 샘플링해야하는 후보 토픽 세트를 제공해야한다고 생각합니까? 이해가 정확합니까? 실제로 이런 종류의 후보 주제 세트를 설정하는 방법은 무엇입니까?

답변:


21

내가 아는 한 많은 주제와 말뭉치를 제공하면됩니다. Grun and Hornik (2011)의 15 페이지 하단에서 시작하는 예제에서 볼 수 있듯이 후보 주제 세트를 지정할 필요는 없습니다 .

1 월 28 일에 업데이트되었습니다. 이제 아래 방법과 약간 다르게 작동합니다. 내 현재 접근 방식은 여기를 참조하십시오 : https : //.com/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 개의 주제가이 데이터에 가장 적합합니다. 이제 13 개의 주제로 LDA 모델을 작성하고 모델을 조사 할 수 있습니다.

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

그리고 모델의 속성을 결정합니다.

이 접근 방식은 다음을 기반으로합니다.

그리피스, TL 및 M. Steyvers 2004. 과학적인 주제 찾기. 미국 국립 과학원의 절차 101 (Suppl 1) : 5228 –5235.


이 코드를 업데이트하고 요점으로 저장했습니다. 기본적으로 인쇄되는 플롯 방법이 있습니다. devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1 좋은 답변.
Tyler Rinker

LDA에서 k를 늘리면 매개 변수 공간이 확장되고 k가 작은 모델은 기본적으로 k가 높은 모델 내에 중첩됩니다. 따라서 LL은 k와 함께 증가해야합니다. k = 13 정도의 작은 범프에서 발생하는 일은 아마도 VEM 알고리즘이 복잡한 모델의 전역 최대 값으로 수렴하지 않기 때문일 수 있습니다. 당신은 AIC 또는 BIC와 더 많은 행운을 가질 것입니다.
VitoshKa

안녕하세요 @ 벤, 정말 유용한 답변입니다. 2-100 개의 주제가있는 모델을 평가할 때 한 가지 질문이 있습니다 best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)}). 왜 데이터의 원시 21:30 만 선택합니까?
Economist_Ayahuasca

몇 년 전 그 답변을 게시 한 이후로 정확하게 기억할 수 없습니다. 그러나 아마도 계산 시간을 짧게 유지하십시오!
Ben

1
이제 주제의 최적의 수를 계산하는이 좋은 PKG가있다 : cran.r-project.org/web/packages/ldatuning
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.