潜在ディリクレ割り当てを使用するための入力パラメーター


17

トピックモデリング(潜在ディリクレ割り当て)を使用する場合、トピックの数はユーザーが指定する必要がある入力パラメーターです。

Dirichletプロセスがサンプリングする必要がある候補トピックセットのコレクションも提供する必要があるように見えますか?私の理解は正しいですか?実際には、この種の候補トピックセットを設定する方法は?

回答:


21

私が知る限り、あなたはいくつかのトピックとコーパスを提供する必要があります。Grun and Hornik(2011)の 15ページの下部から始まる例でわかるように、候補のトピックセットを指定する必要はありませんが、1つを使用できます。

1月28日更新。14以下の方法とは少し異なる方法で作業するようになりました。私の現在のアプローチについてはこちらをご覧くださいhttps : //stackoverflow.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

といったように、モデルの属性を決定します。

このアプローチは以下に基づいています。

Griffiths、TL、M。Steyvers2004。科学的なトピックを見つける。アメリカ合衆国国立科学アカデミーの議事録 101(補足1):5228 –5235。


このためにコードを更新し、要点として保存しました。デフォルトで印刷するplotメソッドがあります。 devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1いい答え。
タイラーリンカー

LDAでkを増やすと、パラメーター空間が拡大し、kが小さいモデルは本質的にkが大きいモデル内にネストされます。したがって、LLはkとともに増加するはずです。k = 13の周りの小さな隆起で起こることは、おそらくVEMアルゴリズムが複雑なモデルのグローバルな最大値に収束しないためです。あなたはAICまたはBICでより多くの運があります。
VitoshKa

こんにちは、@ Ben、本当に役に立つ答えです。2〜100のトピックでモデルを評価しているときに、1つの質問がありますbest.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})。21:30のデータのみを選択するのはなぜですか?
エコノミスト

その答えを投稿したのは数年前だったので、正確に思い出すことはできません。しかし、おそらく計算時間を短くするためです!
ベン

1
最適なトピック数を計算するためのこの素晴らしいパッケージが
ベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.