DTM
分析対象のDTMです。DPCデータです。> dpc_dtm <<DocumentTermMatrix (documents: 1664, terms: 801)>> Non-/sparse entries: 167793/1165071 Sparsity : 87% Maximal term length: 8 Weighting : term frequency (tf) > dpc_dtm$nrow [1] 1664 > dpc_dtm$ncol [1] 801
リスト1.分析対象のDPCデータのDTM
モデルの作成
トピック数を10から100まで10ずつ増やしながらモデルを作ってみました。リスト2はそのスクリプトです。
topic_nums = c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) burnin = 500 iter = 1000 keep = 100 models <- lapply(topic_nums, function(topic_num){ model <- LDA(dpc_dtm, k = topic_num, method = "Gibbs", control = list(burnin = burnin, iter = iter, keep = keep) ) return(model) })
リスト2.モデルの作成
モデルの保存
リスト3は作成したモデルをファイルに保存するスクリプトです。
save(models, file = "models-10-100.rda")
リスト3.モデルをファイルに保存
保存したモデルはloadで読み込むことができます。
load("models-10-100.rda")
リスト4.モデルの読み込み
対数尤度のトピック数依存性
対数尤度の調和平均を計算してトピック数依存性をグラフ表示するスクリプトです。
logLiks_harmonicMean <- lapply(models, function(model){ logLiks <- model@logLiks[-c(1:(burnin/keep))] return(harmonicMean(logLiks)) }) LL <- data.frame( topic_nums = topic_nums, logLiks = unlist(logLiks_harmonicMean) ) ggplot(LL, aes(x=topic_nums, y=logLiks)) + geom_line()
リスト5.対数尤度のトピック数依存性をグラフ表示
実行結果を図1に示します。対数尤度はトピック数の増加とともに増大します。とても収束しそうにありません。過適合しているのでしょうか。
![]() |
図1.対数尤度の調和平均のトピック数依存性 |
対数尤度の変化
モデル作成時に対数尤度がどのように変化するかをトピック数ごとにグラフにするスクリプトです。これを見ればburninはどのくらい必要かがわかります。
logLiks_array <- lapply(models, function(model){ logLiks <- model@logLiks return(logLiks) }) iter_array <- lapply(topic_nums, function(topic){ return(seq(keep,burnin+iter,keep)) }) topic_array <- lapply(topic_nums, function(topic){ return(rep(topic, length(seq(keep,burnin+iter,keep)))) }) LL <- data.frame( topic = factor(unlist(topic_array)), iter = unlist(iter_array), logLiks = unlist(logLiks_array) ) ggplot(data=LL, aes(x=iter, y=logLiks, colour=topic)) + geom_line()
リスト6.対数尤度の変化(トピック数別)
リスト6の実行結果を図2に示します。トピック数の増大に伴い対数尤度は大きくなっていきますが、その勢いは小さくなっているようです。また、収束に必要なburninもトピック数に応じて増えているように見えます。
![]() |
図2.対数尤度の変化 |
0 件のコメント:
コメントを投稿