李航統計學習方法——算法3朴素貝葉斯法


 

一、貝葉斯分類

        是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱貝葉斯分類。而貝葉斯分類中最簡單的一種:朴素貝葉斯分類。

二、貝葉斯定理:

         已知某條件概率,如何得到兩個事件交換后的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。

三、朴素貝葉斯分類思想:

       給出待分類項,求解在此項出現的條件下其他各個類別的出現的概率,哪個概率較大就認為待分類項屬於哪個類別。

四、朴素貝葉斯法分解過程:

       p(yi|x)=p(x|yi)*p(yi)/p(x)  其中對於分母所有類別為常數,因此我們只需將分子最大化皆可。

                

 

        拉普拉斯校准:就是對沒類別下所有划分的計數加1,這樣如果訓練樣本集數量充分大時,並不會對結果產生影響,並且解決了上述頻率為0的尷尬局面。

       下面這個博主講的例子非常簡明,看完了就知道上面的四個步驟的由來

五、案例分析

       來一個李航博士書中案例(Naive Bayes Classifier,或 NBC)實現過程

          首先給出一些定義,輸入空間x屬於Rn為n維向量集合,輸出空間為類標記集合y={c1,c2,...,cK}

1.先驗概率分布,P(Y=ck)即案例中P(Y=1),先驗概率的個數size(y)

2. 條件概率 P(X=x|Y=ck)即案例中P(X(1)=1|Y=1),條件概率的個數等於size(x)*size(y)

朴素貝葉斯法實際上學習到生成數據的機制,屬於生成模型。條件獨立假設等於是說用分類的特征在類確定的條件下都是獨立條件,這一假設會使貝葉斯變得簡單,但是會犧牲一定分類准確率

3.朴素貝葉斯法的學習與分類算法

六、算法實現

  

看了很多博主寫的貝葉斯算法,但是大多數都是只有代碼看不到數據,要么提供了數據,由於自己是新手,看不懂他們如何處理的數據,於是打算自己寫個算法,數據就是本文中的案例數據,代碼見下

'\n'
#encoding=utf-8
import numpy as np
import pandas as pd
test = [2,'S']
def Train(features, labels):
    global label, feature
    # 計算結果的類別
    label = np.unique(labels)
    # 計算數據特征的維度,每個維度不止一個特征值
    features_num = features.shape[1]
    feature = np.unique(features)  #這里可能有文字,文字里面有可能有空格干擾求無重復項
    # 初始化先驗概率和條件概率
    prior = np.zeros(len(label))
    conditional = np.zeros([len(label), len(feature)])
    # 首先計算先驗概率
    for i in range(len(label)):
        label_class_sum = np.sum(labels ==label[i])
        label_len = len(labels)
        prior[i] = float(label_class_sum)/float(label_len)
    # 其次再計算條件概率
        for j in range(len(feature)):
            feature_conditional = features[labels==label[i]]
            feature_class_sum= np.sum(feature_conditional==feature[j])
            conditional[i][j] = float(feature_class_sum)/float(label_class_sum )
    return prior, conditional
def Predict(prior, conditional,test):
    global label,feature
    result = np.zeros(len(label))
    for i in range(len(label)):
        result[i] =conditional[i,feature==test[0]]*conditional[i,feature==test[1]]*(prior[i])
    result = np.vstack([result,label])
    return result

if __name__=="__main__":
    raw_data = pd.read_csv('D:\\Python27\\yy\\data\\three_bayes.csv')
    raw_data = raw_data.replace(' ','',regex=True)
    data = raw_data.values
    labels = data[::,0]
    features = data[::,1::]
    prior_probability, conditional_probability = Train(features, labels)
    result = Predict(prior_probability, conditional_probability, test)
    print 'the test result is',result,

  

 返回結果

the test result is [[0.06666666666666667 0.02222222222222222]
[-1L 1L]]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM