Логарифмические вероятности и качество подгонки модели LDA
___ = logp(___,
задает дополнительные опции, используя один или несколько аргументы пары "имя-значение".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 с 20 темами. Чтобы подавить подробный выход, установите 'Verbose'
в 0.
numTopics = 20;
mdl = fitlda(bag,numTopics,'Verbose',0);
Вычислите логарифмические вероятности документов обучения и отобразите их на гистограмме.
logProbabilities = logp(mdl,documents); figure histogram(logProbabilities) xlabel("Log Probability") ylabel("Frequency") title("Document Log-Probabilities")
Идентифицируйте три документа с самой низкой логарифмической вероятностью. Низкая логарифмическая вероятность может предположить, что документ может быть выбросами.
[~,idx] = sort(logProbabilities); idx(1:3)
ans = 3×1
146
19
65
documents(idx(1:3))
ans = 3x1 tokenizedDocument: 76 tokens: poor soul centre sinful earth sinful earth rebel powers array why dost thou pine suffer dearth painting thy outward walls costly gay why large cost short lease dost thou upon thy fading mansion spend shall worms inheritors excess eat up thy charge thy bodys end soul live thou upon thy servants loss let pine aggravate thy store buy terms divine selling hours dross fed rich shall thou feed death feeds men death once dead theres dying 76 tokens: devouring time blunt thou lions paws make earth devour own sweet brood pluck keen teeth fierce tigers jaws burn longlivd phoenix blood make glad sorry seasons thou fleets whateer thou wilt swiftfooted time wide world fading sweets forbid thee heinous crime o carve thy hours loves fair brow nor draw lines thine antique pen thy course untainted allow beautys pattern succeeding men yet thy worst old time despite thy wrong love shall verse ever live young 73 tokens: brass nor stone nor earth nor boundless sea sad mortality oersways power rage shall beauty hold plea whose action stronger flower o shall summers honey breath hold against wrackful siege battering days rocks impregnable stout nor gates steel strong time decays o fearful meditation alack shall times best jewel times chest lie hid strong hand hold swift foot back spoil beauty forbid o none unless miracle might black ink love still shine bright
Загрузите данные примера. sonnetsCounts.mat
содержит матрицу отсчётов слов и соответствующий словарь предварительно обработанных версий сонетов Шекспира.
load sonnetsCounts.mat
size(counts)
ans = 1×2
154 3092
Подгонка модели LDA с 20 темами.
numTopics = 20; mdl = fitlda(counts,numTopics)
Initial topic assignments sampled in 0.039264 seconds. ===================================================================================== | Iteration | Time per | Relative | Training | Topic | Topic | | | iteration | change in | perplexity | concentration | concentration | | | (seconds) | log(L) | | | iterations | ===================================================================================== | 0 | 0.26 | | 1.159e+03 | 5.000 | 0 | | 1 | 0.14 | 5.4884e-02 | 8.028e+02 | 5.000 | 0 | | 2 | 0.11 | 4.7400e-03 | 7.778e+02 | 5.000 | 0 | | 3 | 0.10 | 3.4597e-03 | 7.602e+02 | 5.000 | 0 | | 4 | 0.13 | 3.4662e-03 | 7.430e+02 | 5.000 | 0 | | 5 | 0.03 | 2.9259e-03 | 7.288e+02 | 5.000 | 0 | | 6 | 0.10 | 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]
Вычислите логарифмические вероятности документов обучения. Укажите, чтобы нарисовать 500 выборки для каждого документа.
numSamples = 500; logProbabilities = logp(mdl,counts, ... 'NumSamples',numSamples);
Отобразите логарифмические вероятности документа в гистограмме.
figure histogram(logProbabilities) xlabel("Log Probability") ylabel("Frequency") title("Document Log-Probabilities")
Идентифицируйте индексы трех документов с самой низкой логарифмической вероятностью.
[~,idx] = sort(logProbabilities); idx(1:3)
ans = 3×1
146
19
65
Сравните качество подгонки для двух моделей LDA путем вычисления недоумения задержанного тестового набора документов.
Чтобы воспроизвести результаты, установите rng
на 'default'
.
rng('default')
Загрузите данные примера. Файл sonnetsPreprocessed.txt
содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txt
разделите текст на документы в символах новой строки, а затем пометьте его токеном.
filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);
Отложите 10% документов наугад для проверки.
numDocuments = numel(documents);
cvp = cvpartition(numDocuments,'HoldOut',0.1);
documentsTrain = documents(cvp.training);
documentsTest = documents(cvp.test);
Создайте модель мешка слов из обучающих документов.
bag = bagOfWords(documentsTrain)
bag = bagOfWords with properties: Counts: [139x2909 double] Vocabulary: [1x2909 string] NumWords: 2909 NumDocuments: 139
Подгонка модели LDA с 20 темами к модели мешка слов. Чтобы подавить подробный выход, установите 'Verbose'
в 0.
numTopics = 20;
mdl1 = fitlda(bag,numTopics,'Verbose',0);
Просмотрите информацию о модели подгонки.
mdl1.FitInfo
ans = struct with fields:
TerminationCode: 1
TerminationStatus: "Relative tolerance on log-likelihood satisfied."
NumIterations: 26
NegativeLogLikelihood: 5.6915e+04
Perplexity: 742.7118
Solver: "cgs"
History: [1x1 struct]
Вычислите недоумение удерживаемого тестового набора.
[~,ppl1] = logp(mdl1,documentsTest)
ppl1 = 781.6078
Подгонка модели LDA с 40 темами к модели мешка слов.
numTopics = 40;
mdl2 = fitlda(bag,numTopics,'Verbose',0);
Просмотрите информацию о модели подгонки.
mdl2.FitInfo
ans = struct with fields:
TerminationCode: 1
TerminationStatus: "Relative tolerance on log-likelihood satisfied."
NumIterations: 37
NegativeLogLikelihood: 5.4466e+04
Perplexity: 558.8685
Solver: "cgs"
History: [1x1 struct]
Вычислите недоумение удерживаемого тестового набора.
[~,ppl2] = logp(mdl2,documentsTest)
ppl2 = 808.6602
Более низкая недоумение предполагает, что модель может быть лучше подгонка к удерживаемым тестовым данным.
ldaMdl
- Входная модель LDAldaModel
объектВходная модель LDA, заданная как ldaModel
объект.
documents
- Входные документыtokenizedDocument
массив | строковые массивы слов | массив ячеек из векторов символовВходные документы, заданные как tokenizedDocument
массив, строковые массивы слов или массив ячеек из векторов символов. Если documents
не является tokenizedDocument
Массив это должно быть вектор-строка, представляющее один документ, где каждый элемент является словом. Чтобы задать несколько документов, используйте tokenizedDocument
массив.
bag
- Входная модельbagOfWords
| объекта bagOfNgrams
объектВходная модель мешка слов или мешка n-граммов, заданная как bagOfWords
объект или bagOfNgrams
объект. Если bag
является bagOfNgrams
объект, затем функция обрабатывает каждый n-грамм как одно слово.
counts
- Частотные счетчики словСчетчики частот слов, заданные как матрица неотрицательных целых чисел. Если вы задаете 'DocumentsIn'
чтобы быть 'rows'
, затем значение counts(i,j)
соответствует количеству раз, когда j-е слово словаря появляется во i-м документе. В противном случае значение counts(i,j)
соответствует количеству раз, когда i-е слово словаря появляется во j-м документе.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'NumSamples',500
задает, чтобы нарисовать 500 выборки для каждого документа'DocumentsIn'
- Ориентация документов'rows'
(по умолчанию) | 'columns'
Ориентация документов в матрице count слов, заданная как разделенная разделенными запятой парами, состоящая из 'DocumentsIn'
и одно из следующих:
'rows'
- Вход является матрицей счетчиков слов со строками, соответствующими документам.
'columns'
- Вход является транспонированной матрицей счетчиков слов со столбцами, соответствующими документам.
Эта опция применяется только в том случае, если документы входа заданы как матрица счетчиков слов.
Примечание
Если вы ориентируете матрицу count слов так, чтобы документы соответствовали столбцам и задавали 'DocumentsIn','columns'
, тогда вы можете испытать значительное сокращение времени оптимизации-выполнения.
'NumSamples'
- Количество выборок для отбораКоличество выборок для рисования каждого документа, заданное как разделенная разделенными запятой парами, состоящая из 'NumSamples'
и положительное целое число.
Пример: 'NumSamples',500
logProb
- Логарифмические вероятностиЛогарифмические вероятности документов под моделью LDA, возвращенные как числовой вектор.
ppl
- НедоумениеНедоумение документов, вычисленных из логарифмических вероятностей, возвращаемое как положительная скалярная величина.
logp
использует итерационный метод псевдосчета, описанный в
[1] Валлах, Ханна М., Айен Мюррей, Руслан Салахутдинов и Дэвид Мимно. «Методы оценки для моделей». В Трудах 26-й ежегодной международной конференции по машинному обучению, стр. 1105-1112. ACM, 2009. Гарвард
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.