機器學習演算法 手撕樸素貝葉斯分類器

2021-09-17 18:24:49 字數 2718 閱讀 9256

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 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...