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

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')

この例の結果を再現するために、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))

入力引数
入力の 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' と次のいずれかで構成されるコンマ区切りのペアとして指定します。
バッチ ソルバー
ソルバーを比較する方法を示す例については、Compare LDA Solversを参照してください。
例: 'Solver','savb'
対数尤度の相対許容誤差。'LogLikelihoodTolerance' と正のスカラーで構成されるコンマ区切りのペアとして指定します。この許容誤差に達すると、最適化が終了します。
例: 'LogLikelihoodTolerance',0.001
トピックの集中度を近似するためのオプション。'FitTopicConcentration' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。
この関数は、トピックの混合率に対してディリクレ事前分布 を当てはめます。 はトピックの集中度で、 は、合計が 1 になるコーパス トピック確率です。
例: 'FitTopicProbabilities',false
データ型: logical
トピックの集中度を近似するためのオプション。'FitTopicConcentration' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。
バッチ ソルバー 'cgs'、'avb'、'cvb0' の場合、FitTopicConcentration の既定値は true です。確率的ソルバー 'savb' の場合、既定値は false です。
この関数は、トピックの混合率に対してディリクレ事前分布 を当てはめます。 はトピックの集中度で、 は、合計が 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 の場合、この関数は学習率を に設定します。 は学習率の減衰です。
LearnRateDecay が 1 に近い場合、学習率の減衰速度が大きくなり、モデルは主に初期のミニバッチから学習します。LearnRateDecay が 0 に近い場合、学習率の減衰速度が小さくなり、モデルはより多くのミニバッチから学習し続けます。詳細については、確率的ソルバーを参照してください。
このオプションは、確率的ソルバー ('savb') のみをサポートします。
例: 'LearnRateDecay',0.75
表示オプション
最適化の収束を監視するための検証データ。'ValidationData' と、bagOfWords オブジェクト、bagOfNgrams オブジェクト、単語カウントのスパース行列のいずれかで構成されるコンマ区切りのペアとして指定します。検証データが行列である場合、そのデータの方向と単語数は入力文書と同じでなければなりません。
モデル検証の頻度 (反復回数)。'ValidationFrequency' と正の整数で構成されるコンマ区切りのペアとして指定します。
既定値は、モデルの当てはめに使用されるソルバーによって異なります。確率的ソルバーの場合、既定値は 10 です。他のソルバーの場合、既定値は 1 です。
詳細レベル。'Verbose' と次のいずれかで構成されるコンマ区切りのペアとして指定します。
0 – 詳細な出力を表示しない。
1 – 進捗状況を表示する。
例: 'Verbose',0
詳細
"潜在的ディリクレ配分" (LDA) モデルは、文書のコレクションに内在するトピックを発見し、トピック内の単語の確率を推測する文書トピック モデルです。LDA は、D 個の文書のコレクションを、単語確率 のベクトルによって特徴付けられた K 個のトピックにわたって、トピック混合率 としてモデル化します。このモデルは、トピック混合率 とトピック がそれぞれ集中度パラメーター と をもつディリクレ分布に従うと仮定します。
トピックの混合率 は、長さ K の確率ベクトルです。ここで、K はトピックの数です。エントリ は、トピック i が d 番目の文書に出現する確率です。トピックの混合率は、ldaModel オブジェクトの DocumentTopicProbabilities プロパティの行に対応します。
トピック は、長さ V の確率ベクトルです。ここで、V はボキャブラリの単語数です。エントリ は、ボキャブラリの v 番目の単語が i 番目のトピックに出現する確率に対応します。トピック は、ldaModel オブジェクトの TopicWordProbabilities プロパティの列に対応します。
トピック とそのトピック混合率でのディリクレ事前分布 について、LDA は文書に対して次の生成プロセスを仮定します。
トピックの混合率を でサンプリングします。確率変数 は、長さ K の確率ベクトルです。ここで、K はトピックの数です。
文書内の単語ごとに、次のようにします。
トピック インデックスを でサンプリングします。確率変数 z は 1 から K までの整数です。ここで、K はトピックの数です。
単語を でサンプリングします。確率変数 w は 1 ~ V の整数です。ここで、V はボキャブラリの単語数であり、ボキャブラリ内の対応する単語を表します。
この生成プロセスの下で、単語 を含む文書の同時分布と、トピックの混合率 、トピック インデックス が次によって与えられます。
ここで、N は文書内の単語数です。z に対する同時分布を合計し、 で積分することで、文書 w の周辺分布が得られます。
次の図は、LDA モデルを確率的グラフィカル モデルとして示したものです。網かけのあるノードは観測変数、網かけのないノードは潜在変数、枠線のないノードはモデル パラメーターです。矢印は確率変数間の依存関係を強調しており、各グループは繰り返しノードを示しています。

"ディリクレ分布" は、多項分布を連続的に一般化したものです。与えられたカテゴリ数 と集中度パラメーター について (ここで は、長さ K の実数の正のベクトル)、ディリクレ分布の確率密度関数は次で与えられます。
ここで、B は次で与えられる多変量ベータ関数を示します。
ディリクレ分布の特殊なケースは "対称ディリクレ分布" です。対称ディリクレ分布は、集中度パラメーター によって特徴付けられます。ここで、 のすべての要素は同じになります。
確率的ソルバーは、文書をミニバッチで処理します。各ミニバッチから計算された確率と以前のすべてのミニバッチからの確率の重み付き和を使用して、トピックごとの単語確率を更新します。
ミニバッチ t の場合、ソルバーは学習率を に設定します。 は学習率の減衰です。
この関数は、学習率の減衰を使用して、
を設定することで、トピックごとの単語確率の行列である を更新します。 はミニバッチ t から学習した行列で、 はミニバッチ 1 から t-1 までを学習した行列です。
学習が始まる前 (t = 0 のとき)、この関数はトピックごとの初期単語確率 を乱数値で初期化します。
参照
[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 で導入R2018b 以降、fitlda は既定で、トピックを入力文書セットのトピック確率の降順で並べ替えます。この動作により、確率の最も高いトピックを見つけやすくなります。
以前のバージョンでは、fitlda はトピックの順序を変更しません。この動作を再現するには、'TopicOrder' オプションを 'unordered' に設定します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)