2012-08-25 93 views
5

Penso di aver implementato la maggior parte correttamente. Una parte mi ha confuso:Naive Bayesian e problema a frequenza zero

Il problema di frequenza zero: Aggiungere 1 al conteggio per ogni combinazione di classe valore di attributo (stimatore Laplace) quando un valore di attributo non si verifica con ogni valore di classe.

Ecco alcuni dei miei codice client:

//Clasify 
string text = "Claim your free Macbook now!"; 
double posteriorProbSpam = classifier.Classify(text, "spam"); 
Console.WriteLine("-------------------------"); 
double posteriorProbHam = classifier.Classify(text, "ham"); 

Ora dire la parola 'libero' è presente nei dati di training da qualche parte

//Training 
classifier.Train("ham", "Attention: Collect your Macbook from store."); 
*Lot more here* 
classifier.Train("spam", "Free macbook offer expiring."); 

Ma la parola è presente nella mia dati di allenamento per la categoria 'spam' non solo in 'ham'. Quindi quando vado a calcolare posteriorProbHam cosa faccio quando mi imbatto nella parola 'free'.

enter image description here

risposta

5

Ancora aggiungerne uno. Il motivo: i modelli Naive Bayes P("free" | spam) e P("free" | ham) come completamente indipendenti, quindi si desidera stimare la probabilità di ciascuno in modo completamente indipendente. Lo stimatore di Laplace che stai utilizzando per P("free" | spam) è (count("free" | spam) + 1)/count(spam); P("ham" | spam) è lo stesso.

Se si pensa a cosa significherebbe non aggiungerne uno, non avrebbe davvero senso: vedere "libero" una volta nel prosciutto renderebbe meno probabile la visualizzazione "gratuita" nello spam.

+0

Grazie. Ho appena modificato per includere la formula che sto seguendo. Quindi per esempio P (viagra | Spam), se i dati di allenamento hanno 0 per il viagra nella categoria 'spam', dovrei aggiungere 1? –

+0

Se si desidera utilizzare il livellamento Laplaciano, aggiungere uno a * tutti * dei numeratori e denominatori, non solo i conteggi zero. Quindi se disponi di 10 | spam gratuiti, 5 gratuiti | non spam, 50 spam totali, 100 non spam totali, stimerai 'P (free | spam) = (10 + 1)/(50 + 1)' , 'P (spam) = (50 + 1)/(150 + 1)', 'P (libero) = (15 + 1)/(150 + 1)'. Puoi anche usare un numero inferiore a 1 (es. 0.1, tipicamente chiamato "alpha", in quanto corrisponde all'utilizzo di una distribuzione [Dirichlet-alpha] (http://en.wikipedia.org/wiki/Dirichlet_distribution) come tuo ] (http://en.wikipedia.org/wiki/Prior_probability) su queste probabilità.) – Dougal

+0

Sì, questo è quello che ho finito per fare. Le cose sembrano buone alcune volte, tuttavia altre finiscono con probabilità maggiori di 1. Osservando la formula sopra, questo è facilmente possibile a seconda del risultato del denominatore. –