樸素貝葉斯的python源碼實現

樸素貝葉斯的python源碼實現

來自專欄 常用機器學習演算法實現與講解

1.前言

樸素貝葉斯的原理比較簡單,在這我簡單的推導一下公式的由來。

假設我們的X有五個特徵分別為x1,x2,x3,x4,x5。則有

在樸素貝葉斯演算法中,它假設了這五個變數之間是相互獨立的:

則上式可化簡為:

而我們需要計算的概率根據貝葉斯公式則可化簡為:

P(y|X)=P(X|y)	imes P(y)

這就是我們需要計算的概率,這裡我們使用高斯模型去擬合 P(x_{i}|y)

這裡我推薦一下吳恩達老師的課程方便大家了解樸素貝葉斯:

鏈接: http://open.163.com/special/opencourse/machinelearning.html

建議閱讀順序:先閱讀源代碼,再來看源碼關鍵方法的講解,源碼地址RRdmlearning/Machine-Learning-From-Scratch

不知為何知乎上的代碼格式沒有原文章便於理解,大家可在cs229論壇社區|深度學習社區|機器學習社區|人工智慧社區上閱讀

2.源碼講解

注意我這裡實現的是樸素貝葉斯模型,而不是高斯判別模型!!!ss

2.1 def fit():

def fit(self, X, y): self.X = X self.y = y self.classes = np.unique(y) self.parameters = {} for i, c in enumerate(self.classes): # 計算每個種類的平均值,方差,先驗概率 X_Index_c = X[np.where(y == c)] X_index_c_mean = np.mean(X_Index_c, axis=0, keepdims=True) X_index_c_var = np.var(X_Index_c, axis=0, keepdims=True) parameters = {"mean": X_index_c_mean, "var": X_index_c_var, "prior": X_Index_c.shape[0] / X.shape[0]} self.parameters["class" + str(c)] = parameters

fit()函數計算每個特徵x1,x2...xn的方差與平均值,以此後面來估算P(xi|y)

2.2 def _pdf:

def _pdf(self, X, classes): # 一維高斯分布的概率密度函數 # eps為防止分母為0 eps = 1e-4 mean = self.parameters["class" + str(classes)]["mean"] var = self.parameters["class" + str(classes)]["var"] # 取對數防止數值溢出 # numerator.shape = [m_sample,feature] numerator = np.exp(-(X - mean) ** 2 / (2 * var + eps)) denominator = np.sqrt(2 * np.pi * var + eps) # 樸素貝葉斯假設(每個特徵之間相互獨立) # P(x1,x2,x3|Y) = P(x1|Y)*P(x2|Y)*P(x3|Y),取對數相乘變為相加 # result.shape = [m_sample,1] result = np.sum(np.log(numerator / denominator), axis=1, keepdims=True) return result.T

這個函數主要是計算P(X|y) = P(x1|y) * P(x2|y) *... P(xn|y)

其中

這裡的對數運算是防止數值溢出

2.3 def _predict

def _predict(self, X): # 計算每個種類的概率P(Y|x1,x2,x3) = P(Y)*P(x1|Y)*P(x2|Y)*P(x3|Y) output = [] for y in range(self.classes.shape[0]): prior = np.log(self.parameters["class" + str(y)]["prior"]) posterior = self._pdf(X, y) prediction = prior + posterior output.append(prediction) return output

_pdf()函數已計算出了P(X|y),_predict()函數計算P(y|X)=P(X|y) * P(y)

2.4 def predicit

def predict(self, X): # 取概率最大的類別返回預測值 output = self._predict(X) output = np.reshape(output, (self.classes.shape[0], X.shape[0])) prediction = np.argmax(output, axis=0) return prediction

返回概率最大的種類為預測值

3.源碼地址

github.com/RRdmlearning

直接運行naive_bayes.py文件即可。

項目包括了許多機器學習演算法的簡潔實現

此文章為記錄自己一路的學習路程,也希望能給廣大初學者們一點點幫助,如有錯誤,疑惑歡迎一起交流。


推薦閱讀:

直觀理解正則化
[貝葉斯一]之貝葉斯定理
機器學習課程筆記---(1)單變數線性回歸
機器學習-聚類
word embedding之GLOVE代碼

TAG:貝葉斯分類 | 機器學習 | Python |