2023年攜程筆試的時候讓手寫樸素貝葉斯分類器,雖然清楚原理,但是沒上手實踐過,在考場上就發揮得很凌亂。
樸素貝葉斯原理較為簡單,給定訓練資料後,直接計算先驗概率和條件概率(類別確定的情況下,某特徵取特定值的概率),然後把新的資料分給後驗概率最大的類。
其中求條件概率時候,python中defaultdict資料結構可以很方便的統計各個特徵的各個取值的個數,可以把dict的value初始化為0。
來看一看defaultdict 和 dict 的區別吧~
>>> a = defaultdict(int)
>>> a
defaultdict(, {})
>>> b = dict()
>>> b
{}# 同樣的操作,a沒有報錯,b報錯了
>>> a[1] += 1
>>> a
defaultdict(, )
>>> b[1] += 1
traceback (most recent call last):
file "", line 1, in keyerror: 1
例題是李航的統計學習方法中的page:50-51
anyway,這只是乙個基礎的框架,還可以繼續優化,比如連續特徵離散化,類別數超過2等等。。。
import numpy as np
from collections import defaultdict
# 訓練資料為15個樣本
x1 = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]
x2 = [1, 2, 2, 1, 1, 1, 2, 2, 3, 3, 3, 2, 2, 3, 3]
y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
input = np.column_stack([x1, x2, y])
# 求樣本點(2,1)的類別
new_data = [2, 1]
class bayes_classifier(object):
'''構造樸素貝葉斯分類器
'''def __init__(self, input, new_data):
self.x = input[:, :-1]
self.y = input[:, -1]
self.prior_prob = self.compute_prior_prob()
self.x1_d0, self.x1_d1 = self.compute_cond_prob(0)
self.x2_d0, self.x2_d1 = self.compute_cond_prob(1)
self.test_data = new_data
def compute_prior_prob(self):
'''先驗概率的極大似然估計
'''prior_prob = defaultdict(int)
for i in range(len(self.y)):
if self.y[i] == -1:
prior_prob[-1] += 1
else:
prior_prob[1] += 1
for key in prior_prob.keys():
prior_prob[key] /= len(self.y)
return prior_prob
def compute_cond_prob(self, j):
'''條件概率的極大似然估計
《類確定的條件下,特徵j取某值的概率》
'''d0 = defaultdict(int)
y0 = 0
d1 = defaultdict(int)
y1 = 0
for n in range(self.x.shape[0]):
if self.y[n] == -1:
d0[self.x[n, j]] += 1
y0 += 1
else:
d1[self.x[n, j]] += 1
y1 += 1
for key, value in d0.items():
d0[key] = value / y0
for key, value in d1.items():
d1[key] = value / y1
return d0, d1
def max_pos_prob(self):
'''最大化後驗概率
'''p0 = self.x1_d0[self.test_data[0]] * self.x2_d0[self.test_data[1]] * self.prior_prob[-1]
p1 = self.x1_d1[self.test_data[0]] * self.x2_d1[self.test_data[1]] * self.prior_prob[1]
return p0, p1
bayes = bayes_classifier(input, new_data)
# print(bayes.unique_y)
# print(bayes.x1_d0, bayes.x2_d0)
# print(bayes.x1_d1, bayes.x2_d1)
# print(bayes.prior_prob)
print(bayes.max_pos_prob())
機器學習演算法 樸素貝葉斯
樸素貝葉斯 na ve bayes 屬於監督學習演算法,實現簡單,學習效率高 由於建立在貝葉斯理論之上,涉及到統計學方法,所以在大樣本量下會有較好的表現,當然樣本需要在一定程度上反映真實分布情況。該演算法的一條假設為 輸入的特徵向量的各分量之間兩兩條件獨立。因為這條假設比較嚴格,能夠完全符合該假設的...
機器學習基礎 樸素貝葉斯分類
可以將公式改寫為 c表示乙個分類,f表示屬性對應的資料字段 這裡舉個例子,c代表蘋果,f代表紅色 p 蘋果 紅色 p 紅色 蘋果 xp 蘋果 p 紅色 通過蘋果是紅色的條件概率可以得到紅色是蘋果的條件概率 通過先驗概率可以算出後驗概率 乙個果子是蘋果的概率為0.3 p c 0.3 乙個果子是紅色的概...
樸素貝葉斯分類
1 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。2 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...