机器学习笔记(一)朴素贝叶斯的Python代码实现
来源:互联网 发布:淘宝正义哥 奶粉 假货 编辑:程序博客网 时间:2024/04/29 23:37
上研究生的时候,一心想读生物信息学的方向,由此也选修了生物数学,计算生物学等相关课程。给我印象最深的是给我们计算生物学的主讲老师,他北大数学系毕业,后来做起了生物和数学的交叉学科研究。课上讲的一些算法比如贝叶斯,马尔科夫,EM等把我给深深折磨了一遍。由于那时候不会编程,对于这些算法的理解只有停留在理论层面。课程结束了,学习也就结束了。最后毕业了,自己没能把生物坚持下去,转而成为了一只程序猿……
偶然间,翻开了自己买的一本机器学习实战的书(Machine learning in Action),看到里面有里面也有代码实现,甚是喜欢,同时也勾起我那段算法学习时光。于是我决定将书中的代码都敲一遍,修炼修炼内功。第一篇就从听出茧子的贝叶斯算法开始吧。
贝叶斯算法的一个核心就是贝叶斯准则:
p(c|x)=p(x|c)*p(c)/p(x)
如果想知道在x条件下c发生的概率,上面的公式提供给了我们一个逆向求解的过程,就是如果我们知道了在c条件下发生x的概率(核心),再加上p(c)和p(x),就可以得到我们想要的结果。这也是上面公式的魅力所在。
在书中,作者给的第一个例子是用贝叶斯方法区分某个网络用语是否文明的。代码如下:
# coding=utf-8from numpy import *def loadDataSet(): postingList=[['my','dog','has','flea','problem','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代表侮辱性文字 return postingList,classVec#创建当地数据库,生成一个大池子def createVocabList(dataSet): vocabSet=set([]) for document in dataSet: #取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 returnVecdef trainNBO(trainMatrix,trainCategory): numTrainDocs=len(trainMatrix) numWords=len(trainMatrix[0]) pAbusive=sum(trainCategory)/float(numTrainDocs) p0Num=ones(numWords)#将矩阵的初始值都设为1,防止一个值为0,相乘以后都为0的情况.ones()为numpy的函数 p1Num=ones(numWords) p0Denom=0.0 p1Denom=0.0 for i in range(numTrainDocs): if trainCategory[i]==1: print("p1Num%s"%p1Num) p1Num+=trainMatrix[i] print("trainMatrix%s"%trainMatrix[i]) p1Denom+=sum(trainMatrix[i]) print("p1Num%s"%p1Num) else: print("p0Num%s"%p0Num) p0Num+=trainMatrix[i] print("trainMatrix%s"%trainMatrix[i]) p0Denom+=sum(trainMatrix[i]) print("p0Num%s"%p0Num) print("p1Num%s"%p1Num); print("p0Num%s"%p0Num) #分别计算在侮辱性语言前提下每个单词出现的概率以及在非侮辱性前提下这个单词出现的概率(p(x|c1)和p(x|c0)) p1Vect=log(p1Num/p1Denom) #设定用log()是为了许多很小的数相乘使得结果过小而超过语言的识别范围 p0Vect=log(p0Num/p0Denom) #change to log() return p0Vect,p1Vect,pAbusivedef classifyNB(vec2classify,p0Vect,p1Vect,pClass1): p1=sum(vec2classify*p1Vect)+log(pClass1)#相当于log(p(c1)*p(x1/c1)*p(x2/c1)) p0=sum(vec2classify*p0Vect)+log(1.0-pClass1) if p1>p0: return 1 else: return 0def testingNB(): listOPosts,listClasses=loadDataSet() myVocablist=createVocabList(listOPosts) trainMat=[] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocablist,postinDoc)) p0V,p1V,pAb=trainNBO(trainMat,listClasses) testEntry=['love','my','dalmation'] thisDoc=array(setOfWords2Vec(myVocablist,testEntry)) print ("testEntry,classified as%s"%classifyNB(thisDoc,p0V,p1V,pAb)) testEntry=['stupid','garbage','hello'] thisDoc=array(setOfWords2Vec(myVocablist,testEntry)) print("testEntry,classified as %s"%classifyNB(thisDoc,p0V,p1V,pAb))if __name__ == '__main__': testingNB()
0 0
- 机器学习笔记(一)朴素贝叶斯的Python代码实现
- 机器学习实战笔记(Python实现)-03-朴素贝叶斯
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(一)
- 用Python Scikit-learn 实现机器学习十大算法--朴素贝叶斯算法(文末有代码)
- 机器学习算法-朴素贝叶斯Python实现
- 机器学习实战笔记(3.3)-朴素贝叶斯算法(多项式模型的朴素贝叶斯实现)
- 机器学习算法python实现---朴素贝叶斯算法(朴素Bayes)
- 机器学习专题(二)—— 朴素贝叶斯算法的python实现
- 机器学习:朴素贝叶斯--python
- 机器学习实战笔记(3.2)-朴素贝叶斯算法(贝努力模型代码实现)
- 机器学习笔记:朴素贝叶斯
- Python机器学习与实战笔记之朴素贝叶斯分类
- python中朴素贝叶斯代码的实现
- 朴素贝叶斯的python代码实现
- 【机器学习算法-python实现】扫黄神器-朴素贝叶斯分类器的实现
- 【机器学习算法-python实现】扫黄神器-朴素贝叶斯分类器的实现
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(二)
- 《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现
- 重载运算符的错误
- 做 h5 推荐几个东西吧
- Spring ClassPathXmlApplicationContext getBean创建实例
- Flask的大型网站模板
- HDU 4544 湫湫系列故事——消灭兔子
- 机器学习笔记(一)朴素贝叶斯的Python代码实现
- Codeforces Round #189 (Div. 1) B. Psychos in a Line
- 算法的是时间复杂度分析
- 关于JSP的思考
- 【杂题】bzoj2144跳跳棋
- Linux学习进阶路线
- hdu 3068 最长回文
- Android5中存储方式之文件外部存储SDCard存储
- Python中文编码问题