Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Implementierung des Naive-Bayes-Algorithmus

Python-Implementierung des Naive-Bayes-Algorithmus

高洛峰
高洛峰Original
2016-10-18 09:11:081290Durchsuche

Vor- und Nachteile des Algorithmus

Vorteile: Immer noch effektiv, wenn weniger Daten vorhanden sind, kann Probleme mit mehreren Kategorien bewältigen

Nachteile: Empfindlich gegenüber der Art und Weise, wie Eingabedaten vorbereitet werden

Anwendbarer Datentyp: Nominaldaten

Algorithmusidee:

Naive Bayes

Wenn wir beispielsweise feststellen möchten, ob eine E-Mail Spam ist, was wissen wir dann? ist das Die Verteilung von Wörtern in E-Mails, dann müssen wir auch wissen: die Häufigkeit bestimmter Wörter in Spam-E-Mails, die mithilfe des Bayes-Theorems ermittelt werden können.

Eine Annahme im Naive Bayes-Klassifikator ist, dass jedes Merkmal gleich wichtig ist

Bayes'sche Klassifikation ist der allgemeine Begriff für eine Klasse von Klassifikationsalgorithmen, die alle auf dem Satz von Bayes als Grundlage basieren , wird sie zusammenfassend als Bayes'sche Klassifikation bezeichnet.

Funktion

loadDataSet()

erstellt einen Datensatz, der aus aufgeteilten Wörtern besteht und Benutzerkommentare in einem Forum darstellt. Tag 1 bedeutet, dass dies ein Fluch ist

createVocabList(dataSet)

Finden Sie heraus, wie viele Wörter diese Sätze insgesamt enthalten, um die Größe unserer Wortvektoren zu bestimmen

setOfWords2Vec (vocabList, inputSet)

Konvertieren Sie den Satz basierend auf den darin enthaltenen Wörtern in einen Vektor. Das Bernoulli-Modell wird hier verwendet, dh nur, ob das Wort existiert

bagOfWords2VecMN(vocabList, inputSet )

Dies ist ein weiteres Modell, das Sätze in Vektoren umwandelt, ein Polynommodell, das die Häufigkeit des Vorkommens eines bestimmten Wortes berücksichtigt

trainNB0(trainMatrix,trainCatergory)

Berechnen Sie P (i) und P (w[i]|C[1]) und P(w[i]|C[0]), hier gibt es zwei Tricks. Einer ist, dass der Startzähler und der Nenner nicht alle auf 0 initialisiert werden Um zu verhindern, dass die Wahrscheinlichkeit, dass einer von ihnen 0 ist, der Gesamtwert 0 ist, und der andere, wird später der multiplikative Logarithmus verwendet, um zu verhindern, dass das Ergebnis aufgrund von Genauigkeitsproblemen 0 ist

classifyNB(vec2Classify, p0Vec, p1Vec, pClass1)

Berechnen Sie dies gemäß der Bayes'schen Formel. Welche der beiden Mengen hat eine höhere Wahrscheinlichkeit, dass der Vektor zu

#coding=utf-8
from numpy import *
def loadDataSet():
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
    return postingList,classVec
#创建一个带有所有单词的列表
def createVocabList(dataSet):
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)
     
def setOfWords2Vec(vocabList, inputSet):
    retVocabList = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:
            retVocabList[vocabList.index(word)] = 1
        else:
            print 'word ',word ,'not in dict'
    return retVocabList
#另一种模型    
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec
def trainNB0(trainMatrix,trainCatergory):
    numTrainDoc = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCatergory)/float(numTrainDoc)
    #防止多个概率的成绩当中的一个为0
    p0Num = ones(numWords)
    p1Num = ones(numWords)
    p0Denom = 2.0
    p1Denom = 2.0
    for i in range(numTrainDoc):
        if trainCatergory[i] == 1:
            p1Num +=trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num +=trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零
    p0Vect = log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive
     
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0
         
def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
    testEntry = ['love', 'my', 'dalmation']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry = ['stupid', 'garbage']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
     
     
def main():
    testingNB()
     
if __name__ == '__main__':
    main()


gehört
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn