fitlda

Подходящая модель скрытого выделения Дирихле (LDA)

Описание

Модель скрытого выделения Дирихле (LDA) является моделью темы, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах. Если модель была подходящим использованием мешка n модели граммов, то программное обеспечение обрабатывает N-граммы как отдельные слова.

пример

mdl = fitlda(bag,numTopics) подбирает модель LDA с numTopics темы к сумке слов или мешку n модели bag граммов.

пример

mdl = fitlda(counts,numTopics) подбирает модель LDA к документам, представленным матрицей подсчета частот.

mdl = fitlda(___,Name,Value) задает дополнительные опции с помощью одного или нескольких аргументов пары "имя-значение".

Примеры

свернуть все

Чтобы воспроизвести результаты в этом примере, установите rng к 'default'.

rng('default')

Загрузите данные в качестве примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит один сонет на строку со словами, разделенными пробелом. Извлеките текст из sonnetsPreprocessed.txt, разделите текст в документы в символах новой строки, и затем маркируйте документы.

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

Создайте модель сумки слов использование bagOfWords.

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

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Подбирайте модель LDA с четырьмя темами.

numTopics = 4;
mdl = fitlda(bag,numTopics)
Initial topic assignments sampled in 0.107614 seconds.
=====================================================================================
| Iteration  |  Time per  |  Relative  |  Training  |     Topic     |     Topic     |
|            | iteration  | change in  | perplexity | concentration | concentration |
|            | (seconds)  |   log(L)   |            |               |   iterations  |
=====================================================================================
|          0 |       0.03 |            |  1.215e+03 |         1.000 |             0 |
|          1 |       0.04 | 1.0482e-02 |  1.128e+03 |         1.000 |             0 |
|          2 |       0.01 | 1.7190e-03 |  1.115e+03 |         1.000 |             0 |
|          3 |       0.02 | 4.3796e-04 |  1.118e+03 |         1.000 |             0 |
|          4 |       0.02 | 9.4193e-04 |  1.111e+03 |         1.000 |             0 |
|          5 |       0.02 | 3.7079e-04 |  1.108e+03 |         1.000 |             0 |
|          6 |       0.02 | 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: [154x4 double]
        TopicWordProbabilities: [3092x4 double]
                    Vocabulary: [1x3092 string]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1x1 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слово th словаря появляется в iдокумент th.

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

         154        3092

Подбирайте модель LDA с 7 темами. Чтобы подавить многословный выход, установите 'Verbose' к 0.

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

Визуализируйте несколько смесей темы с помощью сложенных столбчатых диаграмм. Визуализируйте смеси темы первых трех входных документов.

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 содержит предварительно обработанные версии сонетов Шекспира. Файл содержит один сонет на строку со словами, разделенными пробелом. Извлеките текст из sonnetsPreprocessed.txt, разделите текст в документы в символах новой строки, и затем маркируйте документы.

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

Создайте модель сумки слов использование bagOfWords.

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

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Подбирайте модель LDA с 20 темами.

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

                     NumTopics: 20
             WordConcentration: 1
            TopicConcentration: 5
      CorpusTopicProbabilities: [1x20 double]
    DocumentTopicProbabilities: [154x20 double]
        TopicWordProbabilities: [3092x20 double]
                    Vocabulary: [1x3092 string]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1x1 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))

Входные параметры

свернуть все

Введите сумку слов или мешок n модели граммов, заданной как bagOfWords возразите или bagOfNgrams объект. Если bag bagOfNgrams объект, затем функция обрабатывает N-граммы как отдельные слова.

Количество тем, заданных как положительное целое число. Для примера, показывающего, как выбрать количество тем, смотрите, Выбирают Number of Topics for LDA Model.

Пример: 200

Подсчет частот слов, заданных как матрица неотрицательных целых чисел. Если вы задаете 'DocumentsIn' быть 'rows', затем значение counts(i,j) соответствует числу раз, j th слово словаря появляется в i th документ. В противном случае, значение counts(i,j) соответствует числу раз, i th слово словаря появляется в j th документ.

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'Solver','avb' задает, чтобы использовать аппроксимированного вариационного Бейеса в качестве решателя.

Опции решателя

свернуть все

Решатель для оптимизации, заданной как разделенная запятой пара, состоящая из 'Solver' и одно из следующего:

Стохастический решатель

  • 'savb' – Используйте стохастический аппроксимированный вариационный Байесов [1] [2]. Этот решатель подходит лучше всего для больших наборов данных и может подбирать хорошую модель в меньшем количестве передач данных.

Пакетные решатели

  • 'cgs' – Используйте свернутый Гиббс, производящий [3]. Этот решатель может быть более точным за счет занимания больше времени, чтобы запуститься. resume функция не делает моделей поддержки, снабженных CGS.

  • 'avb' – Используйте аппроксимированного вариационного Бейеса [4]. Этот решатель обычно запускается более быстро, чем свернутый Гиббс, производящий, и свернул вариационного Бейеса, но может быть менее точным.

  • 'cvb0' – Используйте свернутого вариационного Бейеса, нулевой [4] [5] порядка. Этот решатель может быть более точным, чем аппроксимированный вариационный Бейес за счет занимания больше времени, чтобы запуститься.

Для примера, показывающего, как сравнить решатели, смотрите, Сравнивают Решатели LDA.

Пример: 'Solver','savb'

Относительный допуск на логарифмической правдоподобности, заданной как разделенная запятой пара, состоящая из 'LogLikelihoodTolerance' и положительная скалярная величина. Оптимизация завершает работу, когда этот допуск достигнут.

Пример: 'LogLikelihoodTolerance',0.001

Опция для подходящей концентрации темы, заданной как разделенная запятой пара, состоящая из 'FitTopicConcentration' и любой true или false.

Функция соответствует предшествующему Дирихле α=α0(p1p2pK) на смесях темы, где α0 концентрация темы и p1,,pK корпусные вероятности темы, которые суммируют к 1.

Пример: 'FitTopicProbabilities',false

Типы данных: логический

Опция для подходящей концентрации темы, заданной как разделенная запятой пара, состоящая из 'FitTopicConcentration' и любой true или false.

Для пакета решатели 'cgs', 'avb', и 'cvb0', значение по умолчанию для FitTopicConcentration true. Для стохастического решателя 'savb', значением по умолчанию является false.

Функция соответствует предшествующему Дирихле α=α0(p1p2pK) на смесях темы, где α0 концентрация темы и p1,,pK корпусные вероятности темы, которые суммируют к 1.

Пример: 'FitTopicConcentration',false

Типы данных: логический

Первоначальная оценка концентрации темы, заданной как разделенная запятой пара, состоящая из 'InitialTopicConcentration' и неотрицательный скаляр. Функция устанавливает концентрацию на тему к TopicConcentration/NumTopics. Для получения дополнительной информации смотрите Скрытое Выделение Дирихле.

Пример: 'InitialTopicConcentration',25

Порядок темы, заданный как одно из следующего:

  • 'initial-fit-probability' – Сортировка тем корпусными вероятностями темы входного набора документа (CorpusTopicProbabilities свойство.

  • 'unordered' – Не сортируйте темы.

Концентрация Word, заданная как разделенная запятой пара, состоящая из '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 объект или разреженная матрица подсчетов слов. Если данные о валидации являются матрицей, то данные должны иметь ту же ориентацию и то же количество слов как входные документы.

Уровень многословия, заданный как разделенная запятой пара, состоящая из 'Verbose' и одно из следующего:

  • 0 – Не отображайте многословный вывод.

  • 1 – Отобразите информацию о прогрессе.

Пример: 'Verbose',0

Выходные аргументы

свернуть все

Выведите модель LDA, возвращенную как ldaModel объект.

Больше о

свернуть все

Скрытое выделение Дирихле

Модель скрытого выделения Дирихле (LDA) является моделью тематики документа, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах. LDA моделирует набор документов D как смеси темы θ1,,θD, по темам K, охарактеризованным векторами вероятностей слова φ1,,φK. В модели принимается, что смеси темы θ1,,θD, и темы φ1,,φK следуйте за распределением Дирихле параметрами концентрации α и β соответственно.

Смеси темы θ1,,θD векторы вероятности длины K, где K является количеством тем. Запись θdi вероятность темы i, появляющийся в d th документ. Смеси темы соответствуют строкам DocumentTopicProbabilities свойство ldaModel объект.

Темы φ1,,φK векторы вероятности длины V, где V является количеством слов в словаре. Запись φiv соответствует вероятности v th слово словаря, появляющегося в i th тема. Темы φ1,,φK соответствуйте столбцам TopicWordProbabilities свойство ldaModel объект.

Учитывая темы φ1,,φK и предшествующий Дирихле α на смесях темы LDA принимает следующий порождающий процесс для документа:

  1. Произведите смесь темы θ~Дирихле(α). Случайная переменная θ вектор вероятности длины K, где K является количеством тем.

  2. Для каждого слова в документе:

    1. Произведите список тем z~Категориальный(θ). z случайной переменной является целым числом от 1 до K, где K является количеством тем.

    2. Произведите слово w~Категориальный(φz). w случайной переменной является целым числом от 1 до V, где V является количеством слов в словаре и представляет соответствующее слово в словаре.

При этом порождающем процессе, совместном распределении документа со словами w1,,wN, со смесью темы θ, и с индексами темы z1,,zN дают

p(θ,z,w|α,φ)=p(θ|α)n=1Np(zn|θ)p(wn|zn,φ),

где N является количеством слов в документе. Подведение итогов совместного распределения по z и затем интеграция θ дает к предельному распределению документа w:

p(w|α,φ)=θp(θ|α)n=1Nznp(zn|θ)p(wn|zn,φ)dθ.

Следующая схема иллюстрирует модель LDA как вероятностную графическую модель. Теневые узлы являются наблюдаемыми переменными, незаштрихованные узлы являются скрытыми переменными, узлы без основ являются параметрами модели. Стрелы подсвечивают, что зависимости между случайными переменными и пластинами указывают на повторенные узлы.

Распределение Дирихле

Распределение Дирихле является непрерывным обобщением распределения многочлена. Учитывая количество категорий K2, и параметр концентрации α, где α вектор положительных реалов длины K, функцией плотности вероятности распределения Дирихле дают

p(θα)=1B(α)i=1Kθiαi1,

где B обозначает многомерную Бета-функцию, данную

B(α)=i=1KΓ(αi)Γ(i=1Kαi).

Особый случай распределения Дирихле является симметричным распределением Дирихле. Симметричное распределение Дирихле характеризуется параметром концентрации α, где все элементы α то же самое.

Стохастический решатель

Стохастические документы процессов решателя в мини-пакетах. Это обновляет вероятности слова на тему с помощью взвешенной суммы вероятностей, вычисленных от каждого мини-пакета и вероятностей от всех предыдущих мини-пакетов.

Для мини-пакетного t решатель устанавливает темп обучения на η(t)=1/(1+t)κ, где κ затухание темпа обучения.

Функция использует затухание темпа обучения, чтобы обновиться Φ, матрица вероятностей слова на тему, путем установки

Φ(t)=(1η(t))Φ(t1)+η(t)Φ(t*),

где Φ(t*) матрица, усвоенная из мини-пакетного t, и Φ(t1) матрица, усвоенная из мини-пакетов 1 через t-1.

Прежде чем изучение начинается (когда t = 0), функция инициализирует начальные вероятности слова на тему со случайными значениями.

Вопросы совместимости

развернуть все

Поведение изменяется в R2018b

Ссылки

[1] Foulds, Джеймс, Леви Бойлес, Кристофер Дюбуа, Padhraic Smyth и Макс Веллинг. "Стохастический свернутый вариационный Байесов вывод для скрытого выделения Дирихле". В Продолжениях 19-й международной конференции ACM SIGKDD по вопросам открытия Знаний и анализа данных, стр 446–454. ACM, 2013.

[2] Хоффман, Мэтью Д., Дэвид М. Блеи, Чон Ван и Джон Пэйсли. "Стохастический вариационный вывод". Журнал Исследования Машинного обучения 14, № 1 (2013): 1303–1347.

[3] Гриффитс, Томас Л. и Марк Стеиверс. "Находя научные темы". Продолжения Национальной академии наук 101, нет. suppl 1 (2004): 5228–5235.

[4] Асунсьон, Артур, Макс Веллинг, Padhraic Smyth и Yee Whye Teh. "При сглаживании и выводе для моделей темы". В Продолжениях Двадцать пятой Конференции по Неопределенности в Искусственном интеллекте, стр 27–34. Нажатие AUAI, 2009.

[5] Teh, Ии В., Дэвид Ньюман и Макс Веллинг. "Свернутый вариационный Байесов алгоритм вывода для скрытого выделения Дирихле". В Усовершенствованиях в нейронных системах обработки информации, стр 1353–1360. 2007.

Введенный в R2017b