利用朴素贝叶斯算法进行分类的原理
来源:互联网 发布:sqlserver误删数据恢复 编辑:程序博客网 时间:2024/04/30 11:51
最近在看《机器学习实战》,在 第4章“基于概率论的分类方法:朴素贝叶斯”时,有一些心得和体会,想写下来。
该书的该章,对朴素贝叶斯算法及运用到单词分类案例进行了叙述,并给出了python的实现代码,但是并没有从原理角度来解释,为什么可以用这个算法来对单词进行分类,以下是我的一些理解,文章末尾会附上python代码(注:本文代码均出自《机器学习实战》,只是为便于描述,实例内容,进行了替换)
假设,我们现在有一下四句话:
1:你是SB吗
2:你最近好吗
3:你是谁
4:你这个SB
我们很容易判断哪些句子是骂人的话,并且我们对4个句子进行了分词,然后对它们做了统计和标识。如下表所示:
根据常识,我们可以知道“SB”这个词是骂人的,而“好”、“最近”不是骂人的,当然我们可以通过人工一个一个词标识出哪些是骂人的词,但是本文讨论的是运用朴素贝叶斯算法进行分类,所以继续分析,怎样让机器识别哪些是骂人的词呢?也就是把“SB”这个词,划分到骂人分类中。
我们可以统计各个次,在每种分类中出现的概率,这个概率由:单词出现次数和总单纯数算出。以“SB”这个词为例:
它在骂人类句子(第1、4句)中出现了2次,骂人类句子的中单词数是7个,那么“SB”这个次在骂人类别中的概率是2/7=0.285714286;
它在非骂人类句子(第2、3句)中出现了0次,非骂人类句子的中单词数是7个,那么“SB这个次在骂人类别中的概率是0/7=0。
通过过比较“SB”这个单词在骂人和非骂人类中的概率大小判断,认为该词为侮辱性词汇。当然,实际的应用中要比这个复杂,这里这是一个大概的理解。即书本中提到的公式:
如果p1(x,y)>p2(x,y),那么属于分类1;
如果p2(x,y)>p1(x,y),那么属于分类2;
下表对本例中的所有单词进行了分析,如表所示:
从上表可以看到,“这个”词,也被划分到了骂人类单词中,是因为样本数据的局限性,如果有足够多的样本进行训练,算法是可以正确分类的。
另外可以看到,p1和p0都受其非类的总单词数影响,例如在骂人类中,如果单词总数变大,“这个”词的p1,就会减小,从而会将“这个”单词划分到非骂人类中。
python脚本运行结果如下:
python代码如下:
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','streak','how','to','stop','him'] ,['quit','buying','worthless','dog','food','stupid'] ] classVec=[0,1,0,1,0,1] """ postingList=[['你','是','SB','吗'],['你','最近','好','吗'],['你','是','谁'],['你','这个','SB']] classVec=[1,0,0,1] return postingList,classVecdef 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('aaa') return returnVecdef tranNB0(trainMatrix,trainCategory): numTrainDocs=len(trainMatrix) numWords=len(trainMatrix[0]) pAbusive=sum(trainCategory)/float(numTrainDocs) p0Num=zeros(numWords) ;p1Num=zeros(numWords) p0Denom=0.0;p1Denom=0.0 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=p1Num/p1Denom p0Vect=p0Num/p0Denom return p0Vect,p1Vect,pAbusivedef main(): listOPosts,lestClasses=loadDataSet() myVocabList=createVocabList(listOPosts) a=setOfWords2Vec(myVocabList,listOPosts[0]) trainMat=[] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList,postinDoc)) p0,p1,pa=tranNB0(trainMat,lestClasses) p1= [v for v in p1] p0= [v for v in p0] print(myVocabList) print(p1) print(p0) flg=[] for i in range(len(p1)): if p1[i]>p0[i]: flg.append('是') elif p1[i]<p0[i]: flg.append('否') else: flg.append('不确定') print(flg)if __name__ == '__main__': main()
- 利用朴素贝叶斯算法进行分类的原理
- Python利用朴素贝叶斯进行评分的分类
- Python利用朴素贝叶斯进行评分的分类
- 利用朴素贝叶斯模型进行文档分类
- 朴素贝叶斯分类和预测算法的原理及实现
- 朴素贝叶斯算法进行文本分类
- 利用TFIDF策略和朴素贝叶斯算法进行中文文本分类
- 朴素贝叶斯分类原理
- 使用朴素贝叶斯进行文本的分类
- 利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类
- 朴素贝叶斯分类的原理与流程
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- 朴素贝叶斯分类算法
- windows安装storm
- .9.png图片制作
- 微信群控那个好用
- pip安装scipy.0.18出现的问题
- try, excep, else, python关键词
- 利用朴素贝叶斯算法进行分类的原理
- 设计模式C++实现(6)——建造者模式
- Y2K Accounting Bug
- 练习系统 实验三 最小数(删数)
- 536. Construct Binary Tree from String
- 代码维护以及修改
- IP分类
- Tree——Construct Binary Tree from Inorder and Postorder Traversal
- Shatter.RIP-Unleashed\