Зарегистрируйте вероятность реализации Наивного Байеса для классификации текста - PullRequest
3 голосов
/ 27 марта 2011

Я реализую Наивный алгоритм Байеса для классификации текста.У меня ~ 1000 документов для обучения и 400 документов для тестирования.Я думаю, что правильно выполнил учебную часть, но я запутался в тестовой части.Вот что я сделал вкратце:

В моей функции обучения:

vocabularySize= GetUniqueTermsInCollection();//get all unique terms in the entire collection

spamModelArray[vocabularySize]; 
nonspamModelArray[vocabularySize];

for each training_file{
        class = GetClassLabel(); // 0 for spam or 1 = non-spam
        document = GetDocumentID();

        counterTotalTrainingDocs ++;

        if(class == 0){
                counterTotalSpamTrainingDocs++;
        }

        for each term in document{
                freq = GetTermFrequency; // how many times this term appears in this document?
                id = GetTermID; // unique id of the term 

                if(class = 0){ //SPAM
                        spamModelArray[id]+= freq;
                        totalNumberofSpamWords++; // total number of terms marked as spam in the training docs
                }else{ // NON-SPAM
                        nonspamModelArray[id]+= freq;
                        totalNumberofNonSpamWords++; // total number of terms marked as non-spam in the training docs
                }
        }//for


        for i in vocabularySize{
                spamModelArray[i] = spamModelArray[i]/totalNumberofSpamWords;
                nonspamModelArray[i] = nonspamModelArray[i]/totalNumberofNonSpamWords;

        }//for


        priorProb = counterTotalSpamTrainingDocs/counterTotalTrainingDocs;// calculate prior probability of the spam documents
}

Мне кажется, я правильно понял и реализовал учебную часть, но я не уверен, что смог правильно выполнить тестовую часть,Здесь я пытаюсь просмотреть каждый тестовый документ и вычисляю logP (spam | d) и logP (non-spam | d) для каждого документа.Затем я сравниваю эти две величины, чтобы определить класс (спам / не спам).

В моей функции тестирования:

vocabularySize= GetUniqueTermsInCollection;//get all unique terms in the entire collection
for each testing_file:
        document = getDocumentID;

        logProbabilityofSpam = 0;
        logProbabilityofNonSpam = 0;

        for each term in document{
                freq = GetTermFrequency; // how many times this term appears in this document?
                id = GetTermID; // unique id of the term 

                // logP(w1w2.. wn) = C(wj)∗logP(wj)
                logProbabilityofSpam+= freq*log(spamModelArray[id]);
                logProbabilityofNonSpam+= freq*log(nonspamModelArray[id]);
        }//for

        // Now I am calculating the probability of being spam for this document
        if (logProbabilityofNonSpam + log(1-priorProb) > logProbabilityofSpam +log(priorProb)) { // argmax[logP(i|ck) + logP(ck)]
                newclass = 1; //not spam
        }else{
                newclass = 0; // spam
        }

}//for

Моя проблема в том, чтоЯ хочу вернуть вероятность каждого класса вместо точных 1 и 0 (спам / не спам).Я хочу видеть, например, newclass = 0.8684212, чтобы я мог применить порог позже.Но я запутался здесь.Как я могу рассчитать вероятность для каждого документа?Могу ли я использовать logProbabilities для его расчета?

1 Ответ

3 голосов
/ 27 марта 2011

Вероятность данных, описываемых набором признаков { F1 , F2 , ..., Fn }, принадлежащих к классу C , согласно наивной байесовской вероятностной модели, равно

P(C|F) = P(C) * (P(F1|C) * P(F2|C) * ... * P(Fn|C)) / P(F1, ..., Fn)

У вас есть все термины (в логарифмической форме), за исключением термина 1 / P ( F1 , ..., Fn ), поскольку это не используется в простом байесовском классификаторе, который вы реализуете. (Строго говоря, классификатор MAP .)

Вам также нужно будет собрать частоты элементов, и по ним вычислить

P(F1, ..., Fn) = P(F1) * ... * P(Fn)
...