2017-10-10 5 views
0

J'utilise le code suivant pour faire la modélisation du sujet sur mes documents:distribution de probabilité de sujets utilisant 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) 

Je pensais que topic_pr me donne la distribution de probabilité de sujets différents pour chaque document. En d'autres termes, je m'attendais à ce que les nombres dans la sortie (topic_pr) soient des probabilités que le document de la rangée X appartienne à chacun des 50 sujets du modèle. Mais, les chiffres ne s'ajoutent pas à 1. Est-ce vraiment des probabilités? Si non, y a-t-il un moyen de les convertir en probabilités?

Merci

Répondre

0

NMF retourne une factorisation non-négatif, n'a rien à voir avec les probabilités (à ma connaissance). Si vous voulez juste des probabilités, vous pouvez transformer la sortie de NMF (normalisation L1)

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

Cela suppose que topic_pr est une matrice non négative, ce qui est vrai dans votre cas.


EDIT: Apparemment, il existe une version probabiliste de NMF.

sklearn's documetation Citation:

Matrice factorisation non-négative est appliquée avec deux fonctions objectifs différents: la norme de Frobenius, et la divergence Kullback-Leibler généralisée. Ce dernier est équivalent à l'indexation sémantique latente probabiliste.

Pour appliquer ce dernier, qui est ce que vous semblez avoir besoin, à partir du même lien:

lda = LatentDirichletAllocation(n_components=no_topics, max_iter=5) 
topic_pr = lda.fit_transform(tfidf) 
+0

merci pour l'aide. J'ai essayé 'code' nmf = NMF (n_components = no_topics, random_state = 1, beta_loss = 'kullback-leibler', solveur = 'mu', alpha = .1, l1_ratio = .5) .fit (tfidf) mais toujours les résultats N'ajoute pas 1. Ai-je fait quelque chose de mal? –

+0

Avez-vous essayé d'utiliser les deux dernières lignes de ma réponse à la place de NMF? –