樸素貝葉斯分類(Naive Bayesian classification)

算法介紹

概念解析

貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理爲基礎,故統稱爲貝葉斯分類。

貝葉斯定理是以18世紀的一位神學家托馬斯.貝葉斯的名字命名,它率先引入先驗知識和邏輯推理來處理不確定命題。這個定理解決了現實生活裏經常遇到的問題:已知某條件概率,如何得到兩個事件交換後的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這裏先解釋什麼是條件概率:

P(A|B)表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式爲:


貝葉斯定理之所以有用,是因爲我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B)P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就爲我們打通從P(A|B)獲得P(B|A)的道路。

     下面不加證明地直接給出貝葉斯定理:

舉個例子,某個醫院收了6個病人,他們的症狀、職業和疾病如下表所示:

症狀

職業

疾病

打噴嚏

護士

感冒

打噴嚏

農夫

過敏

頭痛

工人

腦震盪

頭痛

工人

感冒

打噴嚏

教師

感冒

頭痛

教師

腦震盪

現在又來了第七個病人,是一個打噴嚏的工人。請問他患上感冒的概率有多大?

根據貝葉斯定理:

 P(A|B) = P(B|A) P(A) / P(B)

可得

   P(感冒|打噴嚏x工人)

    = P(打噴嚏x工人|感冒) x P(感冒)

    / P(打噴嚏x工人)

假定"打噴嚏"和"工人"這兩個特徵是獨立的,因此,上面的等式就變成了

   P(感冒|打噴嚏x工人)

    = P(打噴嚏|感冒) x P(工人|感冒) x P(感冒)

    / P(打噴嚏) x P(工人)

這是可以計算的。

  P(感冒|打噴嚏x工人)

    = 0.66 x 0.33 x 0.5 / 0.5 x 0.33

    = 0.66

因此,這個打噴嚏的工人,有66%的概率是得了感冒。同理,可以計算這個病人患上過敏或腦震盪的概率。比較這幾個概率,就可以知道他最可能得什麼病。

這就是貝葉斯分類器的基本方法:在統計資料的基礎上,依據某些特徵,計算各個類別的概率,從而實現分類。

樸素貝葉斯模型訓練

Python代碼實現如下:

deftrainNB0(trainMatrix,trainCategory):

    numTrainDocs = len(trainMatrix)

    numWords = len(trainMatrix[0])

    pAbusive =sum(trainCategory)/float(numTrainDocs)

    p0Num = ones(numWords); p1Num =ones(numWords)      #初始化向量值

    p0Denom = 2.0; p1Denom = 2.0                        #避免分母爲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 = log(p1Num/p1Denom)          #惡意單詞向量整體相除計算再取log

    p0Vect = log(p0Num/p0Denom)          #正常單詞向量整體相除計算再取log

return p0Vect,p1Vect,pAbusive

 

貝葉斯分類計算

Python代碼實現如下:

defclassifyNB(vec2Classify, p0Vec, p1Vec, pClass1):

    p1 = sum(vec2Classify * p1Vec) +log(pClass1)    #內乘+log

    p0 = sum(vec2Classify * p0Vec) + log(1.0 -pClass1)

    if p1 > p0:

        return 1

    else:

        return 0

Python基於郵件分類的整體流程如下


優點

可以處理多分類問題

在數據較少的情況下仍然有效

缺點

概率前提是各個特徵值是相互獨立的,但是現實中這種情況較少,會影響其準確性。另外一種叫貝葉斯網絡可以解決特徵值關聯問題


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章