メインコンテンツ

fitlda

R2026b

潜在的ディリクレ配分 (LDA) モデルの当てはめ

説明

潜在的ディリクレ配分 (LDA) モデルは、文書のコレクションに内在するトピックを発見し、トピック内の単語の確率を推測するトピック モデルです。bag-of-n-grams モデルを使用して当てはめられたモデルの場合、ソフトウェアは n-gram を個々の単語として扱います。

mdl = fitlda(bag,numTopics) は、トピック数 numTopics の LDA モデルを bag-of-words モデルまたは bag-of-n-grams モデル bag に当てはめます。

例

mdl = fitlda(counts,numTopics) は、LDA モデルを頻度カウントの行列で表される文書に当てはめます。

例

mdl = fitlda(___,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して、追加のオプションを指定します。

例

すべて折りたたむ

この例の結果を再現するために、rng を 'default' に設定します。

rng('default')

サンプル データを読み込みます。ファイル sonnetsPreprocessed.txt には、シェイクスピアのソネット集の前処理されたバージョンが格納されています。ファイルには、1 行に 1 つのソネットが含まれ、単語がスペースで区切られています。sonnetsPreprocessed.txt からテキストを抽出し、テキストを改行文字で文書に分割した後、文書をトークン化します。

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

bagOfWords を使用して bag-of-words モデルを作成します。

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154×3092 double]
      Vocabulary: ["fairest"    "creatures"    "desire"    "increase"    "thereby"    "beautys"    "rose"    "might"    "never"    "die"    "riper"    "time"    "decease"    "tender"    "heir"    "bear"    "memory"    "thou"    "contracted"    …    ]
        NumWords: 3092
    NumDocuments: 154

トピック数 4 の LDA モデルを当てはめます。

numTopics = 4;
mdl = fitlda(bag,numTopics)
Initial topic assignments sampled in 0.263378 seconds.
=====================================================================================
| Iteration  |  Time per  |  Relative  |  Training  |     Topic     |     Topic     |
|            | iteration  | change in  | perplexity | concentration | concentration |
|            | (seconds)  |   log(L)   |            |               |   iterations  |
=====================================================================================
|          0 |       0.17 |            |  1.215e+03 |         1.000 |             0 |
|          1 |       0.02 | 1.0482e-02 |  1.128e+03 |         1.000 |             0 |
|          2 |       0.02 | 1.7190e-03 |  1.115e+03 |         1.000 |             0 |
|          3 |       0.01 | 4.3796e-04 |  1.118e+03 |         1.000 |             0 |
|          4 |       0.01 | 9.4193e-04 |  1.111e+03 |         1.000 |             0 |
|          5 |       0.01 | 3.7079e-04 |  1.108e+03 |         1.000 |             0 |
|          6 |       0.01 | 9.5777e-05 |  1.107e+03 |         1.000 |             0 |
=====================================================================================
mdl = 
  ldaModel with properties:

                     NumTopics: 4
             WordConcentration: 1
            TopicConcentration: 1
      CorpusTopicProbabilities: [0.2500 0.2500 0.2500 0.2500]
    DocumentTopicProbabilities: [154×4 double]
        TopicWordProbabilities: [3092×4 double]
                    Vocabulary: ["fairest"    "creatures"    "desire"    "increase"    "thereby"    "beautys"    "rose"    "might"    "never"    "die"    "riper"    "time"    "decease"    "tender"    "heir"    "bear"    "memory"    "thou"    …    ]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1×1 struct]

ワード クラウドを使用してトピックを可視化します。

figure
for topicIdx = 1:4
    subplot(2,2,topicIdx)
    wordcloud(mdl,topicIdx);
    title("Topic: " + topicIdx)
end

Figure contains objects of type wordcloud. The chart of type wordcloud has title Topic: 1. The chart of type wordcloud has title Topic: 2. The chart of type wordcloud has title Topic: 3. The chart of type wordcloud has title Topic: 4.

LDA モデルを単語カウント行列で表される文書のコレクションに当てはめます。

この例の結果を再現するために、rng を 'default' に設定します。

rng('default')

サンプル データを読み込みます。sonnetsCounts.mat には、シェイクスピアのソネット集の前処理されたバージョンの単語カウントと対応するボキャブラリの行列が格納されています。値 counts(i,j) は、ボキャブラリの j 番目の単語が i 番目の文書に出現する回数に対応します。

load sonnetsCounts.mat
size(counts)
ans = 1×2

         154        3092

トピック数 7 の LDA モデルを当てはめます。詳細出力を表示しないようにするには、'Verbose' を 0 に設定します。

numTopics = 7;
mdl = fitlda(counts,numTopics,'Verbose',0);

積み上げ棒グラフを使用して、複数のトピックの混合率を可視化します。最初の 3 つの入力文書のトピックの混合率を可視化します。

topicMixtures = transform(mdl,counts(1:3,:));
figure
barh(topicMixtures,'stacked')
xlim([0 1])
title("Topic Mixtures")
xlabel("Topic Probability")
ylabel("Document")
legend("Topic "+ string(1:numTopics),'Location','northeastoutside')

Figure contains an axes object. The axes object with title Topic Mixtures, xlabel Topic Probability, ylabel Document contains 7 objects of type bar. These objects represent Topic 1, Topic 2, Topic 3, Topic 4, Topic 5, Topic 6, Topic 7.

この例の結果を再現するために、rng を 'default' に設定します。

rng('default')

サンプル データを読み込みます。ファイル sonnetsPreprocessed.txt には、シェイクスピアのソネット集の前処理されたバージョンが格納されています。ファイルには、1 行に 1 つのソネットが含まれ、単語がスペースで区切られています。sonnetsPreprocessed.txt からテキストを抽出し、テキストを改行文字で文書に分割した後、文書をトークン化します。

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

bagOfWords を使用して bag-of-words モデルを作成します。

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154×3092 double]
      Vocabulary: ["fairest"    "creatures"    "desire"    "increase"    "thereby"    "beautys"    "rose"    "might"    "never"    "die"    "riper"    "time"    "decease"    "tender"    "heir"    "bear"    "memory"    "thou"    "contracted"    …    ]
        NumWords: 3092
    NumDocuments: 154

トピック数 20 の LDA モデルを当てはめます。

numTopics = 20;
mdl = fitlda(bag,numTopics)
Initial topic assignments sampled in 0.513255 seconds.
=====================================================================================
| Iteration  |  Time per  |  Relative  |  Training  |     Topic     |     Topic     |
|            | iteration  | change in  | perplexity | concentration | concentration |
|            | (seconds)  |   log(L)   |            |               |   iterations  |
=====================================================================================
|          0 |       0.04 |            |  1.159e+03 |         5.000 |             0 |
|          1 |       0.05 | 5.4884e-02 |  8.028e+02 |         5.000 |             0 |
|          2 |       0.04 | 4.7400e-03 |  7.778e+02 |         5.000 |             0 |
|          3 |       0.04 | 3.4597e-03 |  7.602e+02 |         5.000 |             0 |
|          4 |       0.03 | 3.4662e-03 |  7.430e+02 |         5.000 |             0 |
|          5 |       0.03 | 2.9259e-03 |  7.288e+02 |         5.000 |             0 |
|          6 |       0.03 | 6.4180e-05 |  7.291e+02 |         5.000 |             0 |
=====================================================================================
mdl = 
  ldaModel with properties:

                     NumTopics: 20
             WordConcentration: 1
            TopicConcentration: 5
      CorpusTopicProbabilities: [0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500 0.0500]
    DocumentTopicProbabilities: [154×20 double]
        TopicWordProbabilities: [3092×20 double]
                    Vocabulary: ["fairest"    "creatures"    "desire"    "increase"    "thereby"    "beautys"    "rose"    "might"    "never"    "die"    "riper"    "time"    "decease"    "tender"    "heir"    "bear"    "memory"    "thou"    …    ]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1×1 struct]

新しい文書の配列の上位トピックを予測します。

newDocuments = tokenizedDocument([
    "what's in a name? a rose by any other name would smell as sweet."
    "if music be the food of love, play on."]);
topicIdx = predict(mdl,newDocuments)
topicIdx = 2×1

    19
     8

ワード クラウドを使用して、予測されたトピックを可視化します。

figure
subplot(1,2,1)
wordcloud(mdl,topicIdx(1));
title("Topic " + topicIdx(1))
subplot(1,2,2)
wordcloud(mdl,topicIdx(2));
title("Topic " + topicIdx(2))

Figure contains objects of type wordcloud. The chart of type wordcloud has title Topic 19. The chart of type wordcloud has title Topic 8.

入力引数

すべて折りたたむ

入力の bag-of-words モデルまたは bag-of-n-grams モデル。bagOfWords オブジェクトまたは bagOfNgrams オブジェクトとして指定します。bag が bagOfNgrams オブジェクトの場合、関数は各 n-gram を 1 つの単語として扱います。

トピック数。正の整数として指定します。トピック数を選択する方法を示す例については、LDA モデルのトピック数の選択を参照してください。

例: 200

単語の頻度カウント。非負の整数の行列として指定します。'DocumentsIn' を 'rows' に指定した場合、値 counts(i,j) は、ボキャブラリの j 番目の単語が i 番目の文書に出現する回数に対応します。そうでない場合、値 counts(i,j) は、ボキャブラリの i 番目の単語が j 番目の文書に出現する回数に対応します。

名前と値の引数

すべて展開する

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: 'Solver','avb' は、近似変分ベイズをソルバーとして使用することを指定します。

ソルバー オプション

すべて展開する

最適化用のソルバー。'Solver' と次のいずれかで構成されるコンマ区切りのペアとして指定します。

確率的ソルバー

  • 'savb' – 確率的近似変分ベイズを使用します [1] [2]。このソルバーは大規模なデータセットに最適で、データを一巡する回数を抑えつつ、適切なモデルを当てはめることができます。

バッチ ソルバー

  • 'cgs' – 崩壊型ギブス サンプリングを使用します [3]。このソルバーでは、実行時間が長くなりますが、精度が高くなる可能性があります。resume 関数は CGS で当てはめられたモデルをサポートしていません。

  • 'avb' – 近似変分ベイズを使用します [4]。このソルバーは通常、崩壊型ギブス サンプリングや崩壊型変分ベイズよりも短時間で実行できますが、精度が低くなる場合があります。

  • 'cvb0' – 崩壊型変分ベイズ、ゼロ次数を使用します [4] [5]。このソルバーでは、実行時間が長くなりますが、近似変分ベイズよりも精度が高くなる可能性があります。

ソルバーを比較する方法を示す例については、Compare LDA Solversを参照してください。

例: 'Solver','savb'

対数尤度の相対許容誤差。'LogLikelihoodTolerance' と正のスカラーで構成されるコンマ区切りのペアとして指定します。この許容誤差に達すると、最適化が終了します。

例: 'LogLikelihoodTolerance',0.001

トピックの集中度を近似するためのオプション。'FitTopicConcentration' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。

この関数は、トピックの混合率に対してディリクレ事前分布 α=α0(p1p2⋯pK) を当てはめます。α0 はトピックの集中度で、p1,…,pK は、合計が 1 になるコーパス トピック確率です。

例: 'FitTopicProbabilities',false

データ型: logical

トピックの集中度を近似するためのオプション。'FitTopicConcentration' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。

バッチ ソルバー 'cgs'、'avb'、'cvb0' の場合、FitTopicConcentration の既定値は true です。確率的ソルバー 'savb' の場合、既定値は false です。

この関数は、トピックの混合率に対してディリクレ事前分布 α=α0(p1p2⋯pK) を当てはめます。α0 はトピックの集中度で、p1,…,pK は、合計が 1 になるコーパス トピック確率です。

例: 'FitTopicConcentration',false

データ型: logical

トピックの集中度の初期推定。'InitialTopicConcentration' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。関数は、トピックごとの集中度を TopicConcentration/NumTopics に設定します。詳細については、潜在的ディリクレ配分を参照してください。

例: 'InitialTopicConcentration',25

トピックの順序。次のいずれかとして指定します。

  • 'initial-fit-probability' – 入力文書セットのコーパス トピック確率 (CorpusTopicProbabilities プロパティ) でトピックを並べ替えます。

  • 'unordered' – トピックを並べ替えません。

単語の集中度。'WordConcentration' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。ソフトウェアは、トピックに対するディリクレ事前分布 (トピックごとの単語確率) を、値が WordConcentration/numWords である対称ディリクレ分布パラメーターになるように設定します。numWords は入力文書のボキャブラリ サイズです。詳細については、潜在的ディリクレ配分を参照してください。

単語カウント行列での文書の方向。'DocumentsIn' と次のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 'rows' – 入力は、文書に対応する行をもつ単語カウントの行列です。

  • 'columns' – 入力は、文書に対応する列をもつ単語カウントの転置行列です。

このオプションは、入力文書を単語カウントの行列として指定した場合にのみ適用されます。

メモ

単語カウント行列の方向を文書が列に対応するように設定し、'DocumentsIn','columns' を指定した場合、最適化の実行時間を大幅に短縮できる可能性があります。

バッチ ソルバーのオプション

すべて展開する

最大反復回数。'IterationLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。

このオプションはバッチ ソルバー ('cgs'、'avb'、'cvb0') のみをサポートします。

例: 'IterationLimit',200

確率的ソルバーのオプション

すべて展開する

データを一巡する最大回数。'DataPassLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。

'DataPassLimit' を指定して、'MiniBatchLimit' を指定しなかった場合、'MiniBatchLimit' の既定値は無視されます。'DataPassLimit' と 'MiniBatchLimit' の両方を指定した場合、fitlda は処理する観測値が最も少なくなる引数を使用します。

このオプションは、確率的ソルバー ('savb') のみをサポートします。

例: 'DataPassLimit',2

ミニバッチ パスの最大数。'MiniBatchLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。

'MiniBatchLimit' を指定して、'DataPassLimit' を指定しなかった場合、fitlda は 'DataPassLimit' の既定値を無視します。'MiniBatchLimit' と 'DataPassLimit' の両方を指定した場合、fitlda は処理する観測値が最も少なくなる引数を使用します。既定値は ceil(numDocuments/MiniBatchSize) で、numDocuments は入力文書の数です。

このオプションは、確率的ソルバー ('savb') のみをサポートします。

例: 'MiniBatchLimit',200

ミニバッチのサイズ。'MiniBatchLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。この関数は、各反復で MiniBatchSize 個の文書を処理します。

このオプションは、確率的ソルバー ('savb') のみをサポートします。

例: 'MiniBatchSize',512

学習率の減衰。'LearnRateDecay' と 1 以下の正のスカラーから成るコンマ区切りのペアとして指定します。

ミニバッチ t の場合、この関数は学習率を η(t)=1/(1+t)κ に設定します。κ は学習率の減衰です。

LearnRateDecay が 1 に近い場合、学習率の減衰速度が大きくなり、モデルは主に初期のミニバッチから学習します。LearnRateDecay が 0 に近い場合、学習率の減衰速度が小さくなり、モデルはより多くのミニバッチから学習し続けます。詳細については、確率的ソルバーを参照してください。

このオプションは、確率的ソルバー ('savb') のみをサポートします。

例: 'LearnRateDecay',0.75

表示オプション

すべて展開する

最適化の収束を監視するための検証データ。'ValidationData' と、bagOfWords オブジェクト、bagOfNgrams オブジェクト、単語カウントのスパース行列のいずれかで構成されるコンマ区切りのペアとして指定します。検証データが行列である場合、そのデータの方向と単語数は入力文書と同じでなければなりません。

モデル検証の頻度 (反復回数)。'ValidationFrequency' と正の整数で構成されるコンマ区切りのペアとして指定します。

既定値は、モデルの当てはめに使用されるソルバーによって異なります。確率的ソルバーの場合、既定値は 10 です。他のソルバーの場合、既定値は 1 です。

詳細レベル。'Verbose' と次のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 0 – 詳細な出力を表示しない。

  • 1 – 進捗状況を表示する。

例: 'Verbose',0

出力引数

すべて折りたたむ

出力 LDA モデル。ldaModel オブジェクトとして返されます。

詳細

すべて折りたたむ

参照

[1] Foulds, James, Levi Boyles, Christopher DuBois, Padhraic Smyth, and Max Welling. "Stochastic collapsed variational Bayesian inference for latent Dirichlet allocation." In Proceedings of the 19th ACM SIGKDD international conference on Knowledge discovery and data mining, pp. 446–454. ACM, 2013.

[2] Hoffman, Matthew D., David M. Blei, Chong Wang, and John Paisley. "Stochastic variational inference." The Journal of Machine Learning Research 14, no. 1 (2013): 1303–1347.

[3] Griffiths, Thomas L., and Mark Steyvers. "Finding scientific topics." Proceedings of the National academy of Sciences 101, no. suppl 1 (2004): 5228–5235.

[4] Asuncion, Arthur, Max Welling, Padhraic Smyth, and Yee Whye Teh. "On smoothing and inference for topic models." In Proceedings of the Twenty-Fifth Conference on Uncertainty in Artificial Intelligence, pp. 27–34. AUAI Press, 2009.

[5] Teh, Yee W., David Newman, and Max Welling. "A collapsed variational Bayesian inference algorithm for latent Dirichlet allocation." In Advances in neural information processing systems, pp. 1353–1360. 2007.

バージョン履歴

R2017b で導入

すべて展開する