python機(jī)器學(xué)習(xí)之貝葉斯分類(lèi)
一、貝葉斯分類(lèi)介紹
貝葉斯分類(lèi)器是一個(gè)統(tǒng)計(jì)分類(lèi)器。它們能夠預(yù)測(cè)類(lèi)別所屬的概率,如:一個(gè)數(shù)據(jù)對(duì)象屬于某個(gè)類(lèi)別的概率。貝葉斯分類(lèi)器是基于貝葉斯定理而構(gòu)造出來(lái)的。對(duì)分類(lèi)方法進(jìn)行比較的有關(guān)研究結(jié)果表明:簡(jiǎn)單貝葉斯分類(lèi)器(稱(chēng)為基本貝葉斯分類(lèi)器)在分類(lèi)性能上與決策樹(shù)和神經(jīng)網(wǎng)絡(luò)都是可比的。在處理大規(guī)模數(shù)據(jù)庫(kù)時(shí),貝葉斯分類(lèi)器已表現(xiàn)出較高的分類(lèi)準(zhǔn)確性和運(yùn)算性能?;矩惾~斯分類(lèi)器假設(shè)一個(gè)指定類(lèi)別中各屬性的取值是相互獨(dú)立的。這一假設(shè)也被稱(chēng)為:類(lèi)別條件獨(dú)立,它可以幫助有效減少在構(gòu)造貝葉斯分類(lèi)器時(shí)所需要進(jìn)行的計(jì)算。
二、貝葉斯定理
p(A|B) 條件概率 表示在B發(fā)生的前提下,A發(fā)生的概率;
基本貝葉斯分類(lèi)器通常都假設(shè)各類(lèi)別是相互獨(dú)立的,即各屬性的取值是相互獨(dú)立的。對(duì)于特定的類(lèi)別且其各屬性相互獨(dú)立,就會(huì)有:
P(AB|C) = P(A|C)*P(B|C)
三、貝葉斯分類(lèi)案例
1.分類(lèi)屬性是離散
假設(shè)有樣本數(shù)為6個(gè)的訓(xùn)練集數(shù)字如下:
現(xiàn)在假設(shè)來(lái)又來(lái)了一個(gè)人是癥狀為咳嗽的教師,那這位教師是患上感冒、發(fā)燒、鼻炎的概率分別是多少呢?這個(gè)問(wèn)題可以用貝葉斯分類(lèi)來(lái)解決,最后三個(gè)疾病哪個(gè)概率高,就把這個(gè)咳嗽的教師劃為哪個(gè)類(lèi),實(shí)質(zhì)就是分別求p(感冒|咳嗽*教師)和P(發(fā)燒 | 咳嗽 * 教師)
P(鼻炎 | 咳嗽 * 教師) 的概率;
假設(shè)各個(gè)類(lèi)別相互獨(dú)立:
P(感冒)=3/6 P(發(fā)燒)=1/6 P(鼻炎)=2/6
p(咳嗽) = 3/6 P(教師)= 2/6
p(咳嗽 | 感冒) = 2/3 P(教師 | 感冒) = 1/3
故
按以上方法可分別求 P(發(fā)燒 | 咳嗽 × 教師) 和P(鼻炎 |咳嗽 × 教師 )的概率;
2.分類(lèi)屬性連續(xù)
如果按上面的樣本上加一個(gè)年齡的屬性;因?yàn)槟挲g是連續(xù),不能采用離散變量的方法計(jì)算概率。而且由于樣本太少,所以也無(wú)法分成區(qū)間計(jì)算;這時(shí),可以假設(shè)感冒、發(fā)燒、鼻炎分類(lèi)的年齡都是正態(tài)分布,通過(guò)樣本計(jì)算出均值和方差,也就是得到正態(tài)分布的密度函數(shù);
下面就以求P(年齡=15|感冒)下的概率為例說(shuō)明:
第一:求在感冒類(lèi)下的年齡平均值 u=(15+48+12)/3=25
第二:求在感冒類(lèi)下年齡的方差 代入下面公司可求:方差=266
第三:把年齡=15 代入正太分布公式如下:參數(shù)代進(jìn)去既可以求的P(age=15|感冒)的概率
其他屬性按離散方法可求;
四、概率值為0處理
假設(shè)有這種情況出現(xiàn),在訓(xùn)練集上感冒的元祖有10個(gè),有0個(gè)是孩子,有6個(gè)是學(xué)生,有4個(gè)教師;當(dāng)分別求
P(孩子|感冒) =0; P(學(xué)生|感冒)=6/10 ; P(教師|感冒)=4/10 ;出現(xiàn)了概率為0的現(xiàn)象,為了避免這個(gè)現(xiàn)象,在假設(shè)訓(xùn)練元祖數(shù)量大量的前提下,可以使用拉普拉斯估計(jì)法,把每個(gè)類(lèi)型加1這樣可求的分別概率是
P(孩子|感冒) = 1/13 ; P(學(xué)生|感冒) = 7/13 ; P(教師|感冒)=4/13
五、垃圾郵件貝葉斯分類(lèi)案例
1.準(zhǔn)備訓(xùn)練集數(shù)據(jù)
假設(shè)postingList為一個(gè)六個(gè)郵件內(nèi)容,classVec=[0,1,0,1,0,1]為郵件類(lèi)型,設(shè)1位垃圾郵件
def loadDataSet(): postingList =[['my','dog','has',' flea','problems','help','please'], ['mybe','not','take','him','to','dog','park','stupid'], ['my','dalmation','is','so','cute','i','love','hime'], ['stop','posting','stupid','worthless','garbage'], ['mr','licks','ate','my','steak','how','to','stop','hime'], ['quit','buying','worthless','dog','food','stupid','quit']] classVec =[0,1,0,1,0,1] return postingList,classVec
2.根據(jù)所有的郵件內(nèi)容創(chuàng)建一個(gè)所有單詞集合
def createVocabList(dataSet): vocabSet =set([]) for document in dataSet: vocabSet = vocabSet | set(document) return list(vocabSet)
測(cè)試后獲取所有不重復(fù)單詞的集合見(jiàn)下一共:
3.根據(jù)2部所有不重復(fù)的單詞集合對(duì)每個(gè)郵件內(nèi)容向量化
def bagOfWords2VecMN(vocabList,inputSet): returnVec =[0]*len(vocabList) for word in inputSet: returnVec[vocabList.index(word)] +=1 return returnVec
測(cè)試后可得如下,打印內(nèi)容為向量化的六個(gè)郵件內(nèi)容
4.訓(xùn)練模型,此時(shí)就是分別求p(垃圾|文檔) = p(垃圾)*p(文檔|垃圾)/p(文檔)
def trainNBO(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords =len(trainMatrix[0]) #計(jì)算p(垃圾)的概率 pAbusive = sum(trainCategory)/float(numTrainDocs) #為了防止一個(gè)概率為0,假設(shè)都有一個(gè) p0Num =ones(numWords); p1Num = ones(numWords) p0Denom =2.0;p1Denom=2.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 = np.log((p1Num/p1Denom)) p0Vect = np.log(p0Num/p0Denom) return p0Vect,p1Vect,pAbusive
對(duì)訓(xùn)練模型進(jìn)行測(cè)試結(jié)果如下:
5.定義分類(lèi)方法
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): p1 =sum(vec2Classify * p1Vec) +math.log(pClass1) p0 = sum(vec2Classify * p0Vec)+math.log(1.0-pClass1) if p1>p0: return 1 else: return 0
6.以上分類(lèi)完成,下面就對(duì)其進(jìn)行測(cè)試,測(cè)試方法如下:
def testingNB(): listOPosts,ListClasses = loadDataSet(); myVocabList = createVocabList(listOPosts) trainMat=[] for postinDoc in listOPosts: trainMat.append(bagOfWords2VecMN(myVocabList,postinDoc)) p0V,p1V,pAb =trainNBO(trainMat,ListClasses) testEntry =['stupid','my','dalmation'] thisDoc = array(bagOfWords2VecMN(myVocabList,testEntry)) print testEntry,'classified as',classifyNB(thisDoc,p0V,p1V,pAb)
結(jié)果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python 實(shí)現(xiàn)樸素貝葉斯算法的示例
- Python實(shí)現(xiàn)樸素貝葉斯的學(xué)習(xí)與分類(lèi)過(guò)程解析
- python實(shí)現(xiàn)基于樸素貝葉斯的垃圾分類(lèi)算法
- python實(shí)現(xiàn)樸素貝葉斯算法
- Python實(shí)現(xiàn)樸素貝葉斯分類(lèi)器的方法詳解
- 樸素貝葉斯分類(lèi)算法原理與Python實(shí)現(xiàn)與使用方法案例
- python實(shí)現(xiàn)樸素貝葉斯分類(lèi)器
- 用Python從零實(shí)現(xiàn)貝葉斯分類(lèi)器的機(jī)器學(xué)習(xí)的教程
- 樸素貝葉斯算法的python實(shí)現(xiàn)方法
- python實(shí)現(xiàn)貝葉斯推斷的例子
相關(guān)文章
Python基于釘釘監(jiān)控發(fā)送消息提醒的實(shí)現(xiàn)
本文主要介紹了Python基于釘釘監(jiān)控發(fā)送消息提醒的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06使用keras框架cnn+ctc_loss識(shí)別不定長(zhǎng)字符圖片操作
這篇文章主要介紹了使用keras框架cnn+ctc_loss識(shí)別不定長(zhǎng)字符圖片操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python二叉樹(shù)的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python二叉樹(shù)的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了二叉樹(shù)鏡像轉(zhuǎn)換的原理及Python相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03如何使用pandas讀取txt文件中指定的列(有無(wú)標(biāo)題)
這篇文章主要介紹了如何使用pandas讀取txt文件中指定的列(有無(wú)標(biāo)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03淺談django開(kāi)發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的
下面小編就為大家?guī)?lái)一篇淺談django開(kāi)發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08pyinstaller打包opencv和numpy程序運(yùn)行錯(cuò)誤解決
這篇文章主要介紹了pyinstaller打包opencv和numpy程序運(yùn)行錯(cuò)誤解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08從運(yùn)行效率與開(kāi)發(fā)效率比較Python和C++
今天小編就為大家分享一篇關(guān)于從運(yùn)行效率與開(kāi)發(fā)效率比較Python和C++,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12解決使用Spyder IDE時(shí)matplotlib繪圖的顯示問(wèn)題
這篇文章主要介紹了解決使用Spyder IDE時(shí)matplotlib繪圖的顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Python+OpenCV圖片局部區(qū)域像素值處理改進(jìn)版詳解
這篇文章主要為大家詳細(xì)介紹了Python+OpenCV圖片局部區(qū)域像素值處理的改進(jìn)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01python 根據(jù)csv表頭、列號(hào)讀取數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了python 根據(jù)csv表頭、列號(hào)讀取數(shù)據(jù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05