Maison > Article > développement back-end > Algorithme Pythonde Naive Bayes
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!