国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python機器學習之貝葉斯分類

2020-01-04 15:25:57
字體:
來源:轉載
供稿:網友

一、貝葉斯分類介紹

貝葉斯分類器是一個統計分類器。它們能夠預測類別所屬的概率,如:一個數據對象屬于某個類別的概率。貝葉斯分類器是基于貝葉斯定理而構造出來的。對分類方法進行比較的有關研究結果表明:簡單貝葉斯分類器(稱為基本貝葉斯分類器)在分類性能上與決策樹和神經網絡都是可比的。在處理大規模數據庫時,貝葉斯分類器已表現出較高的分類準確性和運算性能。基本貝葉斯分類器假設一個指定類別中各屬性的取值是相互獨立的。這一假設也被稱為:類別條件獨立,它可以幫助有效減少在構造貝葉斯分類器時所需要進行的計算。

二、貝葉斯定理

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

 python,機器學習,貝葉斯分類

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

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

三、貝葉斯分類案例

1.分類屬性是離散

假設有樣本數為6個的訓練集數字如下:

python,機器學習,貝葉斯分類

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

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

假設各個類別相互獨立:

python,機器學習,貝葉斯分類

python,機器學習,貝葉斯分類

 python,機器學習,貝葉斯分類

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

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

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

python,機器學習,貝葉斯分類

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

2.分類屬性連續

如果按上面的樣本上加一個年齡的屬性;因為年齡是連續,不能采用離散變量的方法計算概率。而且由于樣本太少,所以也無法分成區間計算;這時,可以假設感冒、發燒、鼻炎分類的年齡都是正態分布,通過樣本計算出均值和方差,也就是得到正態分布的密度函數;

python,機器學習,貝葉斯分類

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

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

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

python,機器學習,貝葉斯分類

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

python,機器學習,貝葉斯分類

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

四、概率值為0處理

假設有這種情況出現,在訓練集上感冒的元祖有10個,有0個是孩子,有6個是學生,有4個教師;當分別求

      P(孩子|感冒) =0; P(學生|感冒)=6/10 ; P(教師|感冒)=4/10  ;出現了概率為0的現象,為了避免這個現象,在假設訓練元祖數量大量的前提下,可以使用拉普拉斯估計法,把每個類型加1這樣可求的分別概率是

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

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

1.準備訓練集數據

假設postingList為一個六個郵件內容,classVec=[0,1,0,1,0,1]為郵件類型,設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.根據所有的郵件內容創建一個所有單詞集合

def createVocabList(dataSet):  vocabSet =set([])  for document in dataSet:   vocabSet = vocabSet | set(document)  return list(vocabSet) 

測試后獲取所有不重復單詞的集合見下一共:

python,機器學習,貝葉斯分類

3.根據2部所有不重復的單詞集合對每個郵件內容向量化 

def bagOfWords2VecMN(vocabList,inputSet):  returnVec =[0]*len(vocabList)  for word in inputSet:   returnVec[vocabList.index(word)] +=1  return returnVec 

測試后可得如下,打印內容為向量化的六個郵件內容

python,機器學習,貝葉斯分類

4.訓練模型,此時就是分別求p(垃圾|文檔) = p(垃圾)*p(文檔|垃圾)/p(文檔)

def trainNBO(trainMatrix,trainCategory):   numTrainDocs = len(trainMatrix)   numWords =len(trainMatrix[0])   #計算p(垃圾)的概率   pAbusive = sum(trainCategory)/float(numTrainDocs)   #為了防止一個概率為0,假設都有一個   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 

對訓練模型進行測試結果如下:

python,機器學習,貝葉斯分類

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.以上分類完成,下面就對其進行測試,測試方法如下:

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) 

結果如下:

python,機器學習,貝葉斯分類

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安阳市| 平遥县| 金坛市| 屏边| 江华| 太和县| 古交市| 池州市| 清镇市| 德庆县| 惠来县| 东兰县| 兴宁市| 博爱县| 尼勒克县| 沂南县| 永和县| 塔河县| 剑河县| 灵宝市| 墨脱县| 阳高县| 承德县| 桃江县| 南皮县| 沧州市| 廊坊市| 申扎县| 通渭县| 平陆县| 遵义市| 正阳县| 西乌珠穆沁旗| 涞水县| 桐梓县| 新巴尔虎左旗| 筠连县| 桃园市| 镶黄旗| 神池县| 九龙城区|