貝葉斯分類器

基本概念和公式

  • 貝葉斯公式
    在這裏插入圖片描述
    p(c)是類“先驗概率”,p(x|c)是樣本x相對於類標記c的類條件概率,p(x)是用於歸一化的“證據因子”
  • 樸素貝葉斯分類器
    採用了屬性條件獨立性假設,對已知類別,假設所有屬性相互獨立。
    公式改寫爲:
    在這裏插入圖片描述
    由於對所有類捏來說,p(x)相同,因此上式可表示爲:
    在這裏插入圖片描述
    爲了避免某些屬性在訓練集中未出現,抹掉其它屬性。採取拉普拉斯修正:
    在這裏插入圖片描述
  • 半樸素貝葉斯分類器
    適當考慮一部分屬性間的相互依賴信息,從而既不需要完全聯合概率計算,又不至於徹底忽略了比較強的屬性依賴關係。半樸素貝葉斯分類器的一種,獨依賴關係(ODE),假設每個屬性在類別之外最多僅依賴一個其它屬性。
    在這裏插入圖片描述
    pai爲屬性xi所依賴的屬性,即父屬性
    三種獨依賴關係分類器:SPODE、TAN、AODE
  • 貝葉斯網
    1.屬性的聯合概率分佈爲:
    在這裏插入圖片描述
    貝葉斯網中三個變量之間的典型依賴關係:同父結構,V型結構,順序結構。其中V型結構具有邊界獨立性。
    道德圖略
    2.學習
    貝葉斯網B=<G,Θ>在D上的評分函數:
    s(B|D)=f(θ)|B| - LL(B|D)
    (|B|表示貝葉斯網的參數個數,f(θ)表示描述每個參數θ所需的字節數,其中第二項可表示爲:)
    在這裏插入圖片描述
    f(θ)=1時,得到AIC評分函數:AIC(B|D)=|B|-LL(B|D)
    f(θ)=1/2logm時,得到BIC評分函數:BIC(B|C)=1/2logm*|B|_LL(B|D)
    推斷略
  • EM算法略

算法實現(文檔實現案例)

  • 基本文本數據處理
#創建用來訓練模型的數據集
def LoadDataSet():
    post_list = [
        ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
        ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
        ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
        ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
        ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
        ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']
    ]
    class_vect = [0, 1, 0, 1, 0, 1]
    return post_list, class_vect


#去除給定文本中重複出現的詞,返回文本詞彙
def Unique(dataset):
    text = dataset
    vocal_list =set([])
    for centence in text:
        vocal_list = vocal_list | set(centence)   #利用set將句子拆分成一個個單詞,且去重
    return list(vocal_list)


#給定一個句子,查詢其詞是否出現在詞典中,出現爲1 ,不出現爲0,返回的是一個向量
def CheckVect (vocab, dataset):
    vect = [0]*len(vocab)
    for data in dataset:
        if data in vocab:
            vect[vocab.index(data)] = 1
    return vect
  • 樸素貝葉斯分類器訓練函數
from numpy import *


def classifyNB0(trainMatrix, trainLabels):
    numSentence = len(trainLabels)
    lenVect = len(trainMatrix[0])
    temp = sum(trainLabels)
    pa = temp/float(numSentence)
    nv0 =ones(lenVect); nv1=ones(lenVect)
    s0 = 2.0; s1 = 2.0
    for i in range(numSentence):
        if trainLabels[i] == 0:
            nv0 += trainMatrix[i]
            s0 += sum(trainMatrix[i])
        else:
            nv1 += trainMatrix[i]
            s1 += sum(trainMatrix[i])
    p0 = exp(nv0/s0); p1 = exp(nv1/s1)
    return p0, p1, pa


  • 樸素貝葉斯分類函數
from numpy import *


def classify(vec2Classify, p0, p1, pa):
    p00 =sum(vec2Classify*p0) + exp(pa)
    p11 = sum(vec2Classify*p1) + exp(pa)
    if p00>p11:
        return 0
    else:
        return 1

優缺點分析

  • 優點
    在數據較少的情況下仍然有效,可以處理多類別問題
  • 缺點
    對輸入數據的準備方式較爲敏感
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章