樸素貝葉斯的python源碼實現
來自專欄 常用機器學習演算法實現與講解
1.前言
樸素貝葉斯的原理比較簡單,在這我簡單的推導一下公式的由來。
假設我們的X有五個特徵分別為x1,x2,x3,x4,x5。則有
在樸素貝葉斯演算法中,它假設了這五個變數之間是相互獨立的:
則上式可化簡為:
而我們需要計算的概率根據貝葉斯公式則可化簡為:
這就是我們需要計算的概率,這裡我們使用高斯模型去擬合
這裡我推薦一下吳恩達老師的課程方便大家了解樸素貝葉斯:
鏈接: 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.源碼地址
https://github.com/RRdmlearning/Machine-Learning-From-Scratch/tree/master/naive_bayes
直接運行naive_bayes.py文件即可。
項目包括了許多機器學習演算法的簡潔實現
此文章為記錄自己一路的學習路程,也希望能給廣大初學者們一點點幫助,如有錯誤,疑惑歡迎一起交流。
推薦閱讀:
※直觀理解正則化
※[貝葉斯一]之貝葉斯定理
※機器學習課程筆記---(1)單變數線性回歸
※機器學習-聚類
※word embedding之GLOVE代碼