Как LDA дает последовательные результаты? - PullRequest
1 голос
/ 27 февраля 2012

Популярная модель тем, Laten Dirichlet Allocation (LDA), которая, когда используется для извлечения тем из корпуса, возвращает разные темы с разным распределением вероятностей по словарным словам.

Принимая во внимание, что Латентное семантическое индексирование (LSI) дает одинаковые темы и одинаковое распределение после каждой итерации.

На самом деле LDA широко используется для извлечения тем. Как LDA поддерживает согласованность, если он возвращает разное распределение тем каждый раз, когда производится классификация?

Рассмотрим этот простой пример. Образец документов берется, где D представляет документ:

D1: Linear Algebra techniques for dimensionality reduction
D2: dimensionality reduction of a sample database
D3: An introduction to linear algebra
D4: Measure of similarity and dissimilarity of different web documents
D5: Classification of data using database sample
D6: overfitting due lack of representative samples
D7: handling overfitting in descision tree
D8: proximity measure for web documents
D9: introduction to web query classification
D10: classification using LSI 

Каждая строка представляет документ. В приведенном выше корпусе модель LDA используется для создания тем из документа. Gensim используется для LDA, пакетное LDA выполняется, когда количество выбранных тем равно 4, а количество проходов - 20.

Теперь в исходном корпусе выполняется пакетное LDA, а темы, созданные после 20 проходов:

topic #0: 0.045*query + 0.043*introduction + 0.042*similarity + 0.042*different + 0.041*reduction + 0.040*handling + 0.039*techniques + 0.039*dimensionality + 0.039*web + 0.039*using

topic #1: 0.043*tree + 0.042*lack + 0.041*reduction + 0.040*measure + 0.040*descision + 0.039*documents + 0.039*overfitting + 0.038*algebra + 0.038*proximity + 0.038*query

topic #2: 0.043*reduction + 0.043*data + 0.042*proximity + 0.041*linear + 0.040*database + 0.040*samples + 0.040*overfitting + 0.039*lsi + 0.039*introduction + 0.039*using

topic #3: 0.046*lsi + 0.045*query + 0.043*samples + 0.040*linear + 0.040*similarity + 0.039*classification + 0.039*algebra + 0.039*documents + 0.038*handling + 0.037*sample

Теперь пакетное LDA снова выполняется в том же исходном корпусе, и в этом случае создаются следующие темы:

topic #0: 0.041*data + 0.041*descision + 0.041*linear + 0.041*techniques + 0.040*dimensionality + 0.040*dissimilarity + 0.040*database + 0.040*reduction + 0.039*documents + 0.038*proximity

topic #1: 0.042*dissimilarity + 0.041*documents + 0.041*dimensionality + 0.040*tree + 0.040*proximity + 0.040*different + 0.038*descision + 0.038*algebra + 0.038*similarity + 0.038*techniques

topic #2: 0.043*proximity + 0.042*data + 0.041*database + 0.041*different + 0.041*tree + 0.040*techniques + 0.040*linear + 0.039*classification + 0.038*measure + 0.038*representative

topic #3: 0.043*similarity + 0.042*documents + 0.041*algebra + 0.041*web + 0.040*proximity + 0.040*handling + 0.039*dissimilarity + 0.038*representative + 0.038*tree + 0.038*measure

Распределение слов в каждой теме не одинаково в обоих случаях. На самом деле, распределение слов никогда не бывает одинаковым.

Так, как LDA эффективно работает, если у него нет такого же распределения слов в его темах как LSI?

Ответы [ 4 ]

3 голосов
/ 28 февраля 2012

Я думаю, что здесь есть две проблемы. Во-первых, LDA training не является детерминированным, как LSI; общие алгоритмы обучения для LDA - методы выборки. Если результаты нескольких тренировочных заездов сильно отличаются, это либо ошибка, либо вы использовали неправильные настройки, либо просто неудача. Вы можете попробовать несколько прогонов обучения LDA, если вы пытаетесь оптимизировать некоторые функции.

Тогда что касается кластеризации, запросов и классификации: как только у вас есть обученная модель LDA, вы можете применить эту модель к другим документам детерминированным способом. Разные модели LDA дают разные результаты, но из одной модели LDA, которую вы пометили как окончательную модель, вы всегда получите один и тот же результат.

0 голосов
/ 22 мая 2019

Я не совсем уверен, что понимаю проблему, но чтобы прояснить это, вы говорите, что LDA производит разное распределение тем при разных прогонах для одного и того же набора данных.

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

gensim.models.ldamodel.LdaModel(
    corpus, num_topics=number_of_topics, id2word=dictionary, passes=15, random_state=1)

Вы видите использование random_state, если вы исправите это число, вы можете легко воспроизвести вывод.

0 голосов
/ 20 мая 2019

Существует три решения этой проблемы:

  1. установить random_seed = 123
  2. pickle - вы можете сохранить вашу обученную модель в виде файла и обработать ее, как вам угодно, без изменения тем. Вы даже можете перенести этот файл на другой компьютер и реализовать его, позвонив. Мы создаем имя файла для предварительно обученной модели, открываем файл, чтобы сохранить его как рассол. Закройте экземпляр маринада. Загрузка сохраненного маринованного соленья LDA:

    LDAMallet_file = 'Your Model'
    
    LDAMallet_pkl = open(LDAMallet_file, 'wb')
    pickle.dump(ldamallet, LDAMallet_pkl)
    
    LDAMallet_pkl_15.close()
    
    LDAMallet_file = 'Your Model'
    LDAMallet_pkl = open(LDAMallet_file, 'rb')
    ldamallet = pickle.load(LDAMallet_pkl)
    
    print("Loaded LDA Mallet wrap --", ldamallet)
    

    Ознакомьтесь с документацией: https://docs.python.org/3/library/pickle.html

    Получите это? мариновать, потому что это сохраняет;)

  3. joblib - то же самое, что и рассол лучше с массивами

Надеюсь, это поможет:)

0 голосов
/ 20 ноября 2013

Если LDA использует случайность как на этапах обучения, так и на этапе логического вывода, он будет каждый раз генерировать разные темы. Смотрите эту ссылку: Модель LDA генерирует разные темы каждый раз, когда я тренируюсь в одном корпусе

...