Maison  >  Article  >  développement back-end  >  Algorithme Pythonde Naive Bayes

Algorithme Pythonde Naive Bayes

巴扎黑
巴扎黑original
2017-09-04 13:41:141893parcourir

Avantages et inconvénients de l'algorithme

Avantages : Toujours efficace lorsqu'il y a moins de données, peut gérer des problèmes multi-catégories

Inconvénients : Sensible à la façon dont les données d'entrée sont préparées

Type de données applicable : données nominales

Idée d'algorithme :

Naive Bayes

Par exemple, si nous voulons déterminer si un e-mail est du spam, alors ce que nous savons est-ce la répartition des mots dans les e-mails, alors nous devons également connaître : la fréquence de certains mots dans les spams, qui peut être obtenue en utilisant le théorème de Bayes.

Une hypothèse dans le classificateur Naive Bayes est que chaque caractéristique est d'égale importance

La classification bayésienne est le terme général désignant une classe d'algorithmes de classification, qui sont tous basés sur le théorème de Bayes comme base , on l'appelle collectivement classification bayésienne.

Fonction

loadDataSet()

crée un ensemble de données L'ensemble de données ici est une phrase composée de mots qui ont été divisés, qui représente les commentaires des utilisateurs sur un forum. La balise 1 signifie que c'est une malédiction

createVocabList(dataSet)

Découvrez combien de mots il y a au total dans ces phrases pour déterminer la taille de nos vecteurs de mots

setOfWords2Vec (vocabList, inputSet)

Convertissez la phrase en vecteur en fonction des mots qu'elle contient. Le modèle de Bernoulli est utilisé ici, c'est-à-dire uniquement si le mot existe

bagOfWords2VecMN(vocabList, inputSet). )

Il s'agit d'un autre modèle qui convertit les phrases en vecteurs, un modèle polynomial, en considérant le nombre d'occurrences d'un certain mot

trainNB0(trainMatrix,trainCatergory)

Calculer P (i) et P (w[i]|C[1]) et P(w[i]|C[0]), il y a deux astuces ici : la première est que le numérateur et le dénominateur de départ ne sont pas tous initialisés à 0. pour éviter que la probabilité que l'un d'eux soit 0 entraîne que le tout soit 0, et l'autre consiste à utiliser le logarithme multiplicatif plus tard pour empêcher le résultat d'être 0 en raison de problèmes de précision

classifyNB(vec2Classify, p0Vec , p1Vec, pClass1)

Calculez cela selon la formule bayésienne Lequel des deux ensembles a la plus forte probabilité que le vecteur appartienne à

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn