2017-02-21 50 views
0

Я попробовал три варианта по умолчанию для alpha в реализации lda gensim и теперь задаюсь вопросом о результате: Сумма вероятностей по темам по всем документам меньше, чем количество документов в корпусе (см. ниже). Например, альфа = «симметричная» дает около 9357 в виде суммы вероятностей тем, однако число тем составляет 9459. Может ли я сказать причину этого неожиданного результата?Gensim LDA alpha-parameter

альфа = симметричные
nr_of_docs = 9459
sum_of_topic_probs = 9357,12285605

альфа = асимметричные
nr_of_docs = 9459
sum_of_topic_probs = +9375,29253851

альфа = авто
nr_of_docs = 9459
sum_of_topic_probs = 9396.4

ответ

0

Я попытался воспроизвести вашу проблему, но в моем случае (с использованием очень маленького корпуса) я не мог найти разницы между тремя суммами.
я до сих пор разделяют пути я пытался в случае кто-либо хочет повторить эту проблему ;-)

я использую некоторые небольшой пример с веб-сайта gensim и обучить три различные модели LDA:

from gensim import corpora, models 
texts = [['human', 'interface', 'computer'], 
     ['survey', 'user', 'computer', 'system', 'response', 'time'], 
     ['eps', 'user', 'interface', 'system'], 
     ['system', 'human', 'system', 'eps'], 
     ['user', 'response', 'time'], 
     ['trees'], 
     ['graph', 'trees'], 
     ['graph', 'minors', 'trees'], 
     ['graph', 'minors', 'survey']] 

dictionary = corpora.Dictionary(texts) 

corpus = [dictionary.doc2bow(text) for text in texts] 

lda_sym = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1, 
             chunksize =100000, passes=1, alpha='symmetric') 
lda_asym = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1, 
             chunksize =100000, passes=1, alpha='asymmetric') 
lda_auto = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1, 
             chunksize =100000, passes=1, alpha='auto') 

Сейчас сумма по теме вероятности для всех документов (9 документов в общей сложности)

counts = {} 
for model in [lda_sym, lda_asym, lda_auto]: 
    s = 0 
    for doc_n in range(len(corpus)): 
     s += pd.DataFrame(lda_sym[corpus[doc_n]])[1].sum() 
     if s < 1: 
      print('Sum smaller than 1 for') 
      print(model, doc_n) 
    counts[model] = s 

И действительно суммы всегда являются 9:

counts = {<gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3908>: 9.0, 
      <gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3048>: 9.0, 
      <gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3b70>: 9.0} 

Конечно, это не типичный пример, так как он настолько мал. Поэтому, если бы вы могли, возможно, предоставили более подробную информацию о вашем корпусе.

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

pd.DataFrame(lda_asym[[]])[1] 

возвращает

0 0.203498 
1 0.154607 
2 0.124657 
3 0.104428 
4 0.089848 
5 0.078840 
6 0.070235 
7 0.063324 
8 0.057651 
9 0.052911 

который идентичен

lda_asym.alpha 

array([ 0.20349777, 0.1546068 , 0.12465746, 0.10442834, 0.08984802, 
    0.0788403 , 0.07023542, 0.06332404, 0.057651 , 0.05291085]) 

который также подводит к 1.

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

Альфа - это гиперпараметр для Дирихле. Дирихле - это распределение, из которого мы рисуем тета. И тета становится параметром, определяющим, какова форма распределения тем. Таким образом, альфа влияет на то, как мы рисуем распределение тем.Именно поэтому, выбирая различные альфы также дадут вам немного разные результаты для

lda.show_topics() 

Но я не понимаю, почему сумма по вероятности документа должна отличаться от 1 для любой модели LDA или любого вида документа.