0

Я пытаюсь классифицировать ввод с двумя классами, вот код. dino и crypto два класса:Получение вероятности класса с использованием naive Bayes

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))) 

Другой подход:

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 

На втором подходе я получил очень малые значения.

Какой из них правильный, или оба они правильные?

+1

Второй подход умножает вероятности, которые могут быть чуть выше нуля, давая итоговый результат после умножения, близкого к нулю. Использование log() уклоняется от этой проблемы. – aleju

+0

@ user3760780: результат от обоих значителен? просто способ представления меняется – nlper

+1

После использования log() вы все равно получите наивысший балл для наиболее вероятного класса. Кроме того, я думаю, что вы не используете 'p_word' во втором подходе. Вы также используете 'cnt' только в первом подходе. – aleju

ответ

2

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

Однако оказывается, что у вас есть ошибки во втором подходе

prob_dino *= p_w_given_dino 

не использует тот факт, что у вас есть cnt вхождений; он должен быть чем-то вроде

prob_dino *= pow(p_w_given_dino, cnt) 
+0

oh thanks buddy, на самом деле я думал, что он будет умножен при повторении цикла for, не задевал, что я уже получаю значение count, и каждое слово повторяется только один раз – nlper