機器學習之樸素貝葉斯算法

1、算法介紹
貝葉斯算法是基於概率論中的貝葉斯定理而來的,但在實際算法中,爲了簡化運算,通常採用的是樸素貝葉斯。樸素貝葉斯(naïve Bayes)法是基於貝葉斯定理與特徵條件獨立假設的分類方法。在統計學中,相互獨立的含義是它們中一個已發生,不影響另一個發生的概率,即特徵條件獨立指一個特徵出現的可能性與其他特徵之間沒有關係。


2、算法基礎(貝葉斯公式的理解)
先驗概率:P(Y=Ck) = count(Y=Ck)/count(all)
條件概率:P(X=x|Y=Ck) = P(X1=x1,X2=x2,...,Xn=xn|Y=Ck)
聯合概率:P(X=x|Y=Ck) * P(Y=Ck)
後驗概率:P(Y=Ck|X=x) = P(X=x|Y=Ck) * P(Y=Ck) / [∑P(X=x|Y=Ck) * P(Y=Ck)]

根據樸素貝葉斯定義,特徵之間的無關性,且每種分類對於公式的分母是不變,所以簡化運算可得:

貝葉斯分類器:y = f(x) = P(X1=x1|Y=Ck)*P(X2=x2|Y=Ck)*...*P(Xn=xn|Y=Ck)*P(Ck)
根據每種分類的概率大小得出結果


3、算法優缺點
優點:在數據集較少的情況下仍然有效,可以處理多分類別問題
缺點:對於輸入數據的準備方式較爲敏感


4、數學例子

性格 身高 上進 喜歡與否
不好 不高 不上進 不喜歡
不帥 不高 上進 不喜歡
不高 上進 喜歡
不帥 上進 喜歡
不好 不高 上進 不喜歡
不帥 不好 不高 不上進 不喜歡
不上進 喜歡
不帥 上進 喜歡
上進 喜歡
不帥 不好 上進 喜歡
不高 不上進 不喜歡
不高 不上進 不喜歡

Q:現在對於一位不帥,性格不好,身高不高,不上進的人,會被分類爲喜歡還是不喜歡呢?
A:P(喜歡|不帥,性格不好,身高不高,不上進)
=P(不帥|喜歡)*P(性格不好|喜歡)*P(身高不高|喜歡)*P(不上進|喜歡)*P(喜歡)
=3/6 * 1/6 * 1/6 * 1/6 * 1/2 = 1/864
P(不喜歡|不帥,性格不好,身高不高,不上進)
=P(不帥|不喜歡)*P(性格不好|不喜歡)*P(身高不高|不喜歡)*P(不上進|不喜歡)*P(不喜歡)
=2/6 * 3/6 * 6/6 * 4/6 * 1/2 = 1/18
因此,根據概率的比較,這位不帥,性格不好,身高不高,不上進的人會被分類爲不喜歡。


5、樸素貝葉斯代碼實現

def classifyByBayes(train_x,train_y,test_x_item):
    num_x = len(train_x)#訓練集的容量
    dict_y = {}#先充當先驗概率的字典,後爲樸素貝葉斯分類器的字典
    for y in train_y:
        if y not in dict_y.keys():
            dict_y[y] = 1
        else:
            dict_y[y] += 1
    for key in dict_y.keys():
        dict_x_temp = {}  # 條件概率的字典
        for x in test_x_item:
            if x not in dict_x_temp.keys():
                dict_x_temp[x] = 0
        for i in range(len(test_x_item)):
            for x in range(len(train_x)):
                if train_y[x] == key:
                    if train_x[x][i] == test_x_item[i]:
                        dict_x_temp[train_x[x][i]] += 1
        for k in dict_x_temp.keys():
            dict_x_temp[k] = dict_x_temp[k] / dict_y[key]
        dict_y[key] = dict_y[key]/num_x
        for value in dict_x_temp.values():
            dict_y[key] = dict_y[key] * value
    dict_y = sorted(dict_y.items(),key=lambda x:x[1],reverse=True)[0][0]
    return dict_y

if __name__ == '__main__':
    train_x = [['帥','性格不好','不高','不上進'],
                    ['不帥','性格好','不高','上進'],
                    ['帥','性格好','不高','上進'],
                    ['不帥','性格好','高','上進'],
                    ['帥','性格不好','不高','上進'],
                    ['不帥','性格不好','不高','不上進']]
    train_y = ['不喜歡','不喜歡','喜歡','喜歡','不喜歡','不喜歡']
    test_x_item = ['不帥','性格不好','不高','不上進']
    print(classifyByBayes(train_x,train_y,test_x_item))

參考書籍:
《統計學習方法》--李航
《機器學習實戰》--Peter

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