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?
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
@ user3760780: les résultats des deux sont considérables non? le mode de représentation change – nlper
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