樸素貝葉斯分類算法介紹及python代碼實現案例

樸素貝葉斯分類算法python

一、樸素貝葉斯分類算法原理算法

1.一、概述app

貝葉斯分類算法是一大類分類算法的總稱less

貝葉斯分類算法以樣本可能屬於某類的機率來做爲分類依據函數

樸素貝葉斯分類算法是貝葉斯分類算法中最簡單的一種post

注:樸素的意思是條件機率獨立性測試

P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)則爲條件機率獨立網站

P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z)ui

 

1.二、算法思想this

樸素貝葉斯的思想是這樣的:

若是一個事物在一些屬性條件發生的狀況下,事物屬於A的機率>屬於B的機率,則斷定事物屬於A

 

通俗來講好比,你在街上看到一個黑人,我讓你猜這哥們哪裏來的,你十有八九猜非洲。爲何呢?

在你的腦海中,有這麼一個判斷流程:

一、這我的的膚色是黑色 <特徵>

二、黑色人種是非洲人的機率最高 <條件機率:黑色條件下是非洲人的機率>

三、沒有其餘輔助信息的狀況下,最好的判斷就是非洲人

這就是樸素貝葉斯的思想基礎。

 

再擴展一下,假如在街上看到一個黑人講英語,那咱們是怎麼去判斷他來自於哪裏?

提取特徵:

膚色: 

語言: 英語

 

黑色人種來自非洲的機率: 80%

黑色人種來自於美國的機率:20%

 

講英語的人來自於非洲的機率:10%

講英語的人來自於美國的機率:90%

 

在咱們的天然思惟方式中,就會這樣判斷:

這我的來自非洲的機率:80% * 10% = 0.08

這我的來自美國的機率:20% * 90% =0.18

咱們的判斷結果就是:此人來自美國!

 

其蘊含的數學原理以下:

p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)* p(xy)/p(xy)=p(A|x)p(A|y)

 

P(類別 | 特徵)=P(特徵 | 類別)*P(類別) / P(特徵)

 

1.三、算法步驟

一、分解各種先驗樣本數據中的特徵

二、計算各種數據中,各特徵的條件機率

(好比:特徵1出現的狀況下,屬於A類的機率p(A|特徵1),屬於B類的機率p(B|特徵1),屬於C類的機率p(C|特徵1)......

三、分解待分類數據中的特徵(特徵1、特徵2、特徵3、特徵4......

四、計算各特徵的各條件機率的乘積,以下所示:

判斷爲A類的機率:p(A|特徵1)*p(A|特徵2)*p(A|特徵3)*p(A|特徵4).....

判斷爲B類的機率:p(B|特徵1)*p(B|特徵2)*p(B|特徵3)*p(B|特徵4).....

判斷爲C類的機率:p(C|特徵1)*p(C|特徵2)*p(C|特徵3)*p(C|特徵4).....

......

五、結果中的最大值就是該樣本所屬的類別

 

1.四、算法應用舉例

大衆點評、淘寶等電商上都會有大量的用戶評論,好比:

1衣服質量太差了!!!!顏色根本不純!!!

2我有一有種上當受騙的感受!!!!

3質量太差,衣服拿到手感受像舊貨!!!

4上身漂亮,合身,很帥,給賣家點贊

5穿上衣服帥呆了,給點一萬個贊

6我在他家買了三件衣服!!!!質量都不好!

0

0

0

1

1

0

 

其中1/2/3/6是差評,4/5是好評

如今須要使用樸素貝葉斯分類算法來自動分類其餘的評論,好比:

a、這麼差的衣服之後不再買了

b、帥,有逼格

……

 

1.五、算法應用流程

一、分解出先驗數據中的各特徵

(即分詞,好比「衣服」「質量太差」「差」「不純」「帥」「漂亮」,「贊」……)

二、計算各種別(好評、差評)中,各特徵的條件機率

(好比 p(「衣服」|差評)p(「衣服」|好評)p(「差」|好評) p(「差」|差評)……)

三、分解出待分類樣本的各特徵

(好比分解a: 「差」 「衣服」 ……)

四、計算類別機率

P(好評) = p(好評|「差」) *p(好評|「衣服」)*……

P(差評) = p(差評|「差」) *p(差評|「衣服」)*……

5、顯然P(差評)的結果值更大,所以a被判別爲「差評」

 

1.六、樸素貝葉斯分類算法案例

 大致計算方法:

P(好評 | 單詞1,單詞2,單詞3) = P(單詞1,單詞2,單詞3 | 好評) * P(好評) / P(單詞1,單詞2,單詞3)

    由於分母都相同,因此只用比較分子便可--->P(單詞1,單詞2,單詞3 | 好評) P(好評)

           每一個單詞之間都是相互獨立的---->P(單詞1 | 好評)P(單詞2 | 好評)P(單詞3 | 好評)*P(好評)

P(單詞1 | 好評) = 單詞1在樣本好評中出現的總次數/樣本好評句子中總的單詞數

P(好評) = 樣本好評的條數/樣本的總條數

同理:

P(差評 | 單詞1,單詞2,單詞3) = P(單詞1,單詞2,單詞3 | 差評) * P(差評) / P(單詞1,單詞2,單詞3)

    由於分母都相同,因此只用比較分子便可--->P(單詞1,單詞2,單詞3 | 差評) P(差評)

           每一個單詞之間都是相互獨立的---->P(單詞1 | 差評)P(單詞2 | 差評)P(單詞3 | 差評)*P(差評)

 1 #!/usr/bin/python
 2 # coding=utf-8
 3 from numpy import *
 4 
 5 # 過濾網站的惡意留言  侮辱性:1     非侮辱性:0
 6 # 建立一個實驗樣本
 7 def loadDataSet():
 8     postingList = [['my','dog','has','flea','problems','help','please'],
 9                    ['maybe','not','take','him','to','dog','park','stupid'],
10                    ['my','dalmation','is','so','cute','I','love','him'],
11                    ['stop','posting','stupid','worthless','garbage'],
12                    ['mr','licks','ate','my','steak','how','to','stop','him'],
13                    ['quit','buying','worthless','dog','food','stupid']]
14     classVec = [0,1,0,1,0,1]
15     return postingList, classVec
16 
17 # 建立一個包含在全部文檔中出現的不重複詞的列表
18 def createVocabList(dataSet):
19     vocabSet = set([])      # 建立一個空集
20     for document in dataSet:
21         vocabSet = vocabSet | set(document)   # 建立兩個集合的並集
22     return list(vocabSet)
23 
24 # 將文檔詞條轉換成詞向量
25 def setOfWords2Vec(vocabList, inputSet):
26     returnVec = [0]*len(vocabList)        # 建立一個其中所含元素都爲0的向量
27     for word in inputSet:
28         if word in vocabList:
29             # returnVec[vocabList.index(word)] = 1     # index函數在字符串裏找到字符第一次出現的位置  詞集模型
30             returnVec[vocabList.index(word)] += 1      # 文檔的詞袋模型    每一個單詞能夠出現屢次
31         else: print "the word: %s is not in my Vocabulary!" % word
32     return returnVec
33 
34 # 樸素貝葉斯分類器訓練函數   從詞向量計算機率
35 def trainNB0(trainMatrix, trainCategory):
36     numTrainDocs = len(trainMatrix)
37     numWords = len(trainMatrix[0])
38     pAbusive = sum(trainCategory)/float(numTrainDocs)
39     # p0Num = zeros(numWords); p1Num = zeros(numWords)
40     # p0Denom = 0.0; p1Denom = 0.0
41     p0Num = ones(numWords);   # 避免一個機率值爲0,最後的乘積也爲0
42     p1Num = ones(numWords);   # 用來統計兩類數據中,各詞的詞頻
43     p0Denom = 2.0;  # 用於統計0類中的總數
44     p1Denom = 2.0  # 用於統計1類中的總數
45     for i in range(numTrainDocs):
46         if trainCategory[i] == 1:
47             p1Num += trainMatrix[i]
48             p1Denom += sum(trainMatrix[i])
49         else:
50             p0Num += trainMatrix[i]
51             p0Denom += sum(trainMatrix[i])
52             # p1Vect = p1Num / p1Denom
53             # p0Vect = p0Num / p0Denom
54     p1Vect = log(p1Num / p1Denom)    # 在類1中,每一個次的發生機率
55     p0Vect = log(p0Num / p0Denom)      # 避免下溢出或者浮點數舍入致使的錯誤   下溢出是由太多很小的數相乘獲得的
56     return p0Vect, p1Vect, pAbusive
57 
58 # 樸素貝葉斯分類器
59 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
60     p1 = sum(vec2Classify*p1Vec) + log(pClass1)
61     p0 = sum(vec2Classify*p0Vec) + log(1.0-pClass1)
62     if p1 > p0:
63         return 1
64     else:
65         return 0
66 
67 def testingNB():
68     listOPosts, listClasses = loadDataSet()
69     myVocabList = createVocabList(listOPosts)
70     trainMat = []
71     for postinDoc in listOPosts:
72         trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
73     p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
74     testEntry = ['love','my','dalmation']
75     thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
76     print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
77     testEntry = ['stupid','garbage']
78     thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
79     print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
80 
81 # 調用測試方法----------------------------------------------------------------------
82 testingNB()

 

 運行結果:

相關文章
相關標籤/搜索