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