вероятностное распределение тем с использованием NMF

Я использую следующий код для моделирования тем в своих документах:

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
tfidf_vectorizer = TfidfVectorizer(tokenizer=tokenize, max_df=0.85, min_df=3, ngram_range=(1,5))

tfidf = tfidf_vectorizer.fit_transform(docs)
tfidf_feature_names = tfidf_vectorizer.get_feature_names()


from sklearn.decomposition import NMF

no_topics = 50

%time nmf = NMF(n_components=no_topics, random_state=11,  init='nndsvd').fit(tfidf)
topic_pr= nmf.transform(tfidf)

Я думал, что topic_pr дает мне вероятностное распределение различных тем для каждого документа. Другими словами, я ожидал, что числа в выводе (topic_pr) будут вероятностью того, что документ в строке X принадлежит каждой из 50 тем в модели. Но цифры не складываются в 1. Это действительно вероятности? Если нет, есть ли способ преобразовать их в вероятности?

Спасибо


person Monica Muller    schedule 10.10.2017    source источник


Ответы (1)


NMF возвращает неотрицательную факторизацию, не имеет ничего общего с вероятностями (насколько мне известно). Если вам просто нужны вероятности, вы можете преобразовать вывод NMF (нормализация L1)

probs = topic_pr / topic_pr.sum(axis=1, keepdims=True)

Это предполагает, что topic_pr является неотрицательной матрицей, что верно в вашем случае.


РЕДАКТИРОВАТЬ: по-видимому, существует вероятностная версия NMF.

Цитирование документация sklearn:

Неотрицательная матричная факторизация применяется с двумя разными целевыми функциями: нормой Фробениуса и обобщенной дивергенцией Кульбака-Лейблера. Последнее эквивалентно вероятностному скрытому семантическому индексированию.

Чтобы применить последнее, что вам, кажется, нужно, по той же ссылке:

lda = LatentDirichletAllocation(n_components=no_topics, max_iter=5)
topic_pr = lda.fit_transform(tfidf)
person Imanol Luengo    schedule 10.10.2017
comment
Спасибо за помощь. Я попробовал code nmf = NMF(n_components=no_topics, random_state=1, beta_loss='kullback-leibler', Solver='mu', alpha=.1, l1_ratio=.5).fit(tfidf), но все же результаты не в сумме 1. Я сделал что-то не так? - person Monica Muller; 10.10.2017
comment
Вы пытались использовать последние две строки моего ответа вместо NMF? - person Imanol Luengo; 10.10.2017