4-3 樸素貝葉斯 最大似然估計算法過程

樸素貝葉斯算法

輸入:
樣本數據T,包含m個n維特徵的樣本。
aij爲每個樣本特徵的第i個特徵可取到的第j個值。
測試樣本x
輸出:
對x的預測分類。

計算先驗概率

Pk(Y=Ck)=I(y=Ck)m P_k(Y=C_k) = \frac {\sum I(y=C_k)}{m}

計算每個特徵每個取值的條件概率

PijkP_{ijk}爲當y=Cky=C_kXj時,X第j個特徵爲aija_{ij}的條件概率

Pijk=I(X(i)=aij,y=Ck)I(y=Ck) P_{ijk} = \frac{\sum I(X^{(i)} = a_{ij}, y=C_k)}{\sum I(y=C_k)}

計算假如y=Cky=C_k時出現X=x的條件概率

對所有CkC_k計算P(X=xY=Ck)P(X=x|Y=C_k)
P(X=xY=Ck)P(X=x|Y=C_k)爲當y=Cky=C_k時,x的每一個特徵的條件概率的乘積。
P(X=xY=Ck)=P(x(i)=aiy=Ck) P(X=x|Y=C_k) = \prod P(x^{(i)}=a_i|y=C_k)

計算當X=x時所有CkC_k的後驗概率的分子

P(Y=CkX=x)=P(X=xY=Ck)P(Y=Ck)P(X=x) P(Y=C_k|X=x) = \frac{P(X=x|Y=C_k)P(Y=C_k)}{P(X=x)}
以上公式中分子所有需要的內容都在以前已經計算出,代入公式即可
不需要計算分母。因爲最終要用到的不是後驗概率的具體數值,只是要比較大小。中所有C_k的後驗概率公式,分母都是相同的,不影響大小的比較,所以不用計算出來。

確定x的分類

當X=x時所有CkC_k的後驗概率中分子取得最大概率的那CkC_k即x的分類

代碼

def NaiveteBayes(T, y, a, Y, x):
    # 計算先驗概率
    prepro = {}
    for yRange in Y:
        #print (yRange, Y[Y==yRange].shape[0], )
        prepro[yRange] = y[y==yRange].shape[0]/y.shape[0]
    print('先驗概率:',prepro)
    # 計算條件概率
    conpro = {}
    for i in range(len(a)):  # 遍歷每個特徵
        for j in a[i]: # 遍歷特徵的每個取值
            for k in Y:
                conpro[(i,j, k)] = X[(y==k)&(X[:,i]==j),:].shape[0]/X[y==k,:].shape[0]
    print('條件概率:',conpro)
    # 計算後驗概率的分子
    postpro = {}
    for yRange in Y:
        pro = 1
        for i in range(x.shape[0]):
            pro = pro * conpro[(i, x[i], yRange)]
        postpro[yRange] = pro * prepro[yRange]
    print ('後驗概率', postpro)
    # 確定X的分類
    import operator
    return sorted(postpro.items(),   # iterable -- 可迭代對象,在python2中使用A.iteritems(),在python3中使用A.items()
           key=operator.itemgetter(1),   # key -- 主要是用來進行比較的元素,指定可迭代對象中的一個元素來進行排序,這裏指基於item的value進行排序
           reverse=True)[0][0]   # reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
# 排序結果是一個list
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章