2012-08-25 4 views
5

나는 대부분 올바르게 구현했다고 생각합니다. 한 부분으로 나를 혼란스럽게 만들었습니다.Naive 베이지안 및 제로 - 주파수 문제

제로 주파수 문제 : 모든 클래스 값에 속성 값이 발생하지 않으면 모든 속성 값 - 클래스 조합 (Laplace estimator)에 대한 개수에 1을 더하십시오.

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

지금 단어 '무료'라고 어딘가에 훈련 데이터에

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

존재하지만 단어 카테고리 내 훈련 데이터에 존재 :

여기 내 클라이언트 코드의 일부입니다 '스팸'은 '햄'에만 없습니다. 그래서 posteriorProbam을 계산할 때 '무료'라는 단어를 발견하면 어떻게해야합니까?

enter image description here

답변

5

또 하나를 추가 할 수 있습니다. 그 이유는 Naive Bayes가 P("free" | spam)P("free" | ham)을 완전히 독립적이라고 모델링하기 때문에 각각의 확률을 완전히 독립적으로 추정하고자합니다. P("free" | spam)에 사용중인 Laplace 견적 도구는 (count("free" | spam) + 1)/count(spam)입니다. P("ham" | spam)은 같습니다.

하나를 추가하지 않는다면 어떤 의미인지 생각해보십시오. 실제로는 의미가 없습니다. 한 번만 "무료"라고 표시하면 스팸에 "무료"가 표시 될 가능성이 줄어 듭니다.

+0

감사합니다. 나는 내가 따르고있는 수식을 포함하도록 편집했습니다. 따라서 예를 들어 P (viagra | Spam)의 경우, 훈련 데이터가 '스팸'범주의 바이아그라에 대해 0으로 계산되면 1을 더 추가해야합니다. –

+0

라플라시안 스무딩을 사용하려면 제로 카운트가 아닌 분자와 분모의 * all *에 하나를 더하십시오. 따라서 10 개의 무료 스팸, 5 개의 무료 비 스팸, 50 개의 스팸 총계, 100 개의 비 스팸 총계가있는 경우 'P (무료 | 스팸) = (10 + 1)/(50 + 1) , P (스팸) = (50 + 1)/(150 + 1), P (무료) = (15 + 1)/(150 + 1). [Dirichlet-alpha] (http://en.wikipedia.org/wiki/Dirichlet_distribution) 배포판을 사용하는 것과 일치하므로 1보다 작은 수 (예 : 0.1, 일반적으로 "alpha"라고도 함)를 사용할 수도 있습니다 ] (http://en.wikipedia.org/wiki/Prior_probability) 이러한 가능성에.) – Dougal

+0

그래, 내가 그 일을 끝냈다. 상황이 좋을 때도 있지만 다른 사람들은 1보다 큰 확률로 끝납니다. 위 공식을 보면 분모의 결과에 따라 쉽게 가능합니다. –