最近在搞一个创新idea,主要就是利用贝叶斯网络来做软件项目工期估算和管理,基本算法已经研究个差不多了,而在研究贝叶斯网络前,最开始研究了朴素贝叶斯方法(Naive Bayes),这是一种基于贝叶斯定理与特征条件独立假设的分类方法,这种方法可以应用到很多应用场景中。
那么,利用朴素贝叶斯方法来做分类有什么好处呢?最大的好处在于即时样本数据很少,这种分类方法依然有效,并且可以用来处理多分类问题。
在本案例中,我们将使用Python提供的朴素贝叶斯方法来做文本分类:
贝叶斯公式如下:
贝叶斯公式是用来计算事件发生概率的。怎么来解释贝叶斯公式呢?举一个简单例子说明。假如班级里有40个同学,15个男生,25个女生,性别和特征分布如下:
假设头发和声音都是独立特征,于是:
男生头发长声音粗的概率=15/40*1/15*1=0.025
女生头发长声音粗的概率=25/40*20/25*3/25=0.06
因为0.025
这就是朴素贝叶斯分类方法。就是这么简单。
具体实现本文开始提到的文本分析案例,首先要建立一个样本数据集(Data Set),然后,分词训练,根据这些单词出现在脏话句子里的频率来判断给出的句子是不是脏话,如果给出的句子中包含不在样本数据集里的单词给出提示,逻辑清晰,直接上代码:
#author: hanshiqiang365
from numpy import *
import re
import random
def loadDataSet():
postingList = [['My', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['Maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['My', 'Husky', 'is', 'so', 'cute', 'I', 'love', 'him'],
['Stop', 'posting', 'stupid', 'worthless', 'garbage'],
['Mr.', 'Wang', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['Quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0, 1, 0, 1, 0, 1] #1 - Dirty Words
return postingList, classVec
def createVocabList(dataSet):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0] * len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] = 1
else:
print("the word: %s is not in my Vocabulary!" % word)
return returnVec
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory) / float(numTrainDocs)
p0Num = ones(numWords)
p1Num = ones(numWords)
p0Denom = 2
p1Denom = 2
for i in range(numTrainDocs):
if trainCategory[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)
p0 = sum(vec2Classify*p0Vec)+log(1-pClass1)
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', 'Husky']
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))
if __name__=='__main__':
testingNB()
程序运行结果符合预期。
利用贝叶斯公式可以计算出各种情况发生的概率,然后比较概率大小做推理判断。贝叶斯公式是人工智能算法的基础,可以说,如果没有贝叶斯公式,也就没有人工智能算法。江湖传说,前Google算法工程师差点因为没有记住贝叶斯公式而被一家创业公司拒之门外!
在很多时候,我们对于很多事物是知其然不知其所以然,对于人工智能就是这样,而要做到知其所以然,就必须要研究人工智能的算法基础,这不只是要记一些公式就可以的,必须要搞明白这些公式背后的原理,贝叶斯公式就是其中之一,并且,也是最重要的一个。
领取专属 10元无门槛券
私享最新 技术干货