溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python機(jī)器學(xué)習(xí)之貝葉斯分類

發(fā)布時(shí)間:2020-08-20 20:15:01 來源:腳本之家 閱讀:170 作者:劍曇說 欄目:開發(fā)技術(shù)

一、貝葉斯分類介紹

貝葉斯分類器是一個(gè)統(tǒng)計(jì)分類器。它們能夠預(yù)測(cè)類別所屬的概率,如:一個(gè)數(shù)據(jù)對(duì)象屬于某個(gè)類別的概率。貝葉斯分類器是基于貝葉斯定理而構(gòu)造出來的。對(duì)分類方法進(jìn)行比較的有關(guān)研究結(jié)果表明:簡(jiǎn)單貝葉斯分類器(稱為基本貝葉斯分類器)在分類性能上與決策樹和神經(jīng)網(wǎng)絡(luò)都是可比的。在處理大規(guī)模數(shù)據(jù)庫時(shí),貝葉斯分類器已表現(xiàn)出較高的分類準(zhǔn)確性和運(yùn)算性能?;矩惾~斯分類器假設(shè)一個(gè)指定類別中各屬性的取值是相互獨(dú)立的。這一假設(shè)也被稱為:類別條件獨(dú)立,它可以幫助有效減少在構(gòu)造貝葉斯分類器時(shí)所需要進(jìn)行的計(jì)算。

二、貝葉斯定理

p(A|B) 條件概率 表示在B發(fā)生的前提下,A發(fā)生的概率;

 python機(jī)器學(xué)習(xí)之貝葉斯分類

基本貝葉斯分類器通常都假設(shè)各類別是相互獨(dú)立的,即各屬性的取值是相互獨(dú)立的。對(duì)于特定的類別且其各屬性相互獨(dú)立,就會(huì)有:

 P(AB|C) = P(A|C)*P(B|C)

三、貝葉斯分類案例

1.分類屬性是離散

假設(shè)有樣本數(shù)為6個(gè)的訓(xùn)練集數(shù)字如下:

python機(jī)器學(xué)習(xí)之貝葉斯分類

現(xiàn)在假設(shè)來又來了一個(gè)人是癥狀為咳嗽的教師,那這位教師是患上感冒、發(fā)燒、鼻炎的概率分別是多少呢?這個(gè)問題可以用貝葉斯分類來解決,最后三個(gè)疾病哪個(gè)概率高,就把這個(gè)咳嗽的教師劃為哪個(gè)類,實(shí)質(zhì)就是分別求p(感冒|咳嗽*教師)和P(發(fā)燒 | 咳嗽 * 教師)

P(鼻炎 | 咳嗽 * 教師) 的概率;

假設(shè)各個(gè)類別相互獨(dú)立:

python機(jī)器學(xué)習(xí)之貝葉斯分類

python機(jī)器學(xué)習(xí)之貝葉斯分類

 python機(jī)器學(xué)習(xí)之貝葉斯分類

 P(感冒)=3/6    P(發(fā)燒)=1/6     P(鼻炎)=2/6

 p(咳嗽) = 3/6   P(教師)= 2/6

 p(咳嗽 | 感冒) = 2/3   P(教師 | 感冒) = 1/3

python機(jī)器學(xué)習(xí)之貝葉斯分類

按以上方法可分別求  P(發(fā)燒 | 咳嗽 × 教師) 和P(鼻炎 |咳嗽 × 教師 )的概率;

2.分類屬性連續(xù)

如果按上面的樣本上加一個(gè)年齡的屬性;因?yàn)槟挲g是連續(xù),不能采用離散變量的方法計(jì)算概率。而且由于樣本太少,所以也無法分成區(qū)間計(jì)算;這時(shí),可以假設(shè)感冒、發(fā)燒、鼻炎分類的年齡都是正態(tài)分布,通過樣本計(jì)算出均值和方差,也就是得到正態(tài)分布的密度函數(shù);

python機(jī)器學(xué)習(xí)之貝葉斯分類

下面就以求P(年齡=15|感冒)下的概率為例說明:

   第一:求在感冒類下的年齡平均值  u=(15+48+12)/3=25

   第二:求在感冒類下年齡的方差 代入下面公司可求:方差=266

python機(jī)器學(xué)習(xí)之貝葉斯分類

   第三:把年齡=15 代入正太分布公式如下:參數(shù)代進(jìn)去既可以求的P(age=15|感冒)的概率

python機(jī)器學(xué)習(xí)之貝葉斯分類

其他屬性按離散方法可求;

四、概率值為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è)類型加1這樣可求的分別概率是

      P(孩子|感冒) = 1/13  ; P(學(xué)生|感冒) = 7/13   ; P(教師|感冒)=4/13

 五、垃圾郵件貝葉斯分類案例

1.準(zhǔn)備訓(xùn)練集數(shù)據(jù)

假設(shè)postingList為一個(gè)六個(gè)郵件內(nèi)容,classVec=[0,1,0,1,0,1]為郵件類型,設(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ù)單詞的集合見下一共:

python機(jī)器學(xué)習(xí)之貝葉斯分類

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)容

python機(jī)器學(xué)習(xí)之貝葉斯分類

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é)果如下:

python機(jī)器學(xué)習(xí)之貝葉斯分類

5.定義分類方法

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.以上分類完成,下面就對(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é)果如下:

python機(jī)器學(xué)習(xí)之貝葉斯分類

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI