0

J'essaie de classer l'entrée avec deux classes, voici le code. dino et crypto sont deux classes:Obtenir la probabilité de classe en utilisant Bayes naive

for w, cnt in list(counts.items()): #count is dict with word and it's count value 
    p_word = vocab[w]/sum(vocab.values()) 
    p_w_given_dino = (word_counts["dino"].get(w, 0.0) + 1)/(sum(word_counts["dino"].values()) + v) 
    p_w_given_crypto = (word_counts["crypto"].get(w, 0.0) + 1)/(sum(word_counts["crypto"].values()) + v) 

    log_prob_dino += math.log(cnt * p_w_given_dino/p_word) 
    log_prob_crypto += math.log(cnt * p_w_given_crypto/p_word) 

print("Score(dino) :", math.exp(log_prob_dino + math.log(prior_dino))) 
print("Score(crypto):", math.exp(log_prob_crypto + math.log(prior_crypto))) 

Une autre approche est:

prior_dino = (priors["dino"]/sum(priors.values())) 
prior_crypto = (priors["crypto"]/sum(priors.values())) 
for w, cnt in list(counts.items()): 
    p_word = vocab[w]/sum(vocab.values()) 
    p_w_given_dino = (word_counts["dino"].get(w, 0.0) + 1)/(sum(word_counts["dino"].values()) + v) 
    p_w_given_crypto = (word_counts["crypto"].get(w, 0.0) + 1)/(sum(word_counts["crypto"].values()) + v) 
    prob_dino *= p_w_given_dino 
    prob_crypto *= p_w_given_crypto 
t_prior_dino = prob_dino * prior_dino 
t_prior_crypto = prob_crypto * prior_crypto 

Sur la deuxième approche, je suis très petites valeurs.

Lequel est correct, ou les deux sont-ils corrects?

+1

La deuxième approche multiplie les probabilités, qui pourraient être juste au-dessus de zéro, donnant un résultat total après la multiplication proche de zéro. L'utilisation de log() élude ce problème. – aleju

+0

@ user3760780: les résultats des deux sont considérables non? le mode de représentation change – nlper

+1

Après avoir utilisé log(), vous devriez obtenir le score le plus élevé pour la classe la plus probable. En outre, je pense que vous n'utilisez pas 'p_word' dans la seconde approche. Vous n'utilisez également 'cnt' que dans la première approche. – aleju

Répondre

2

Ce sont des approches complètement équivalentes. Le premier est cependant préférable, car travailler sur des logarithmes de probabilités rend l'ensemble du processus plus stable numériquement. Les résultats doivent être identiques (jusqu'à des erreurs numériques).

Cependant, il semble que vous avez des erreurs dans la deuxième approche

prob_dino *= p_w_given_dino 

ne pas utiliser le fait que vous avez cnt occurences; il devrait être quelque chose comme

prob_dino *= pow(p_w_given_dino, cnt) 
+0

oh merci mon pote, en fait je pensais qu'il serait multiplié quand itéré par pour boucle, n'a pas frappé que je reçois déjà la valeur de compte et chaque mot itéré une seule fois – nlper