【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯
Python機器學習算法實現
Author:louwill
? ? ?
???? 今天要講的算法是樸素貝葉斯(Naive Bayes)。相較于之前的支持向量機等模型,樸素貝葉斯就要簡單多了。樸素貝葉斯是一種基于貝葉斯定理和特征條件獨立假設的分類算法。
???? 簡單而言,對于給定的訓練數據,樸素貝葉斯先基于特征條件獨立假設學習輸入和輸出的聯合概率分布,然后基于此分布對于新的實例,利用貝葉斯定理計算出最大的后驗概率。樸素貝葉斯不會直接學習輸入輸出的聯合概率分布,而是通過學習類的先驗概率和類條件概率來完成。
???? 所謂樸素貝葉斯中樸素的含義,即特征條件獨立假設,條件獨立假設就是說用于分類的特征在類確定的條件下都是條件獨立的。這一假設使得樸素貝葉斯的學習成為可能。樸素貝葉斯算法具體步驟如下。
首先計算類先驗概率:
類先驗概率可直接用極大似然估計進行計算。
然后計算類條件概率:
最后給定新的實例,計算其對應的最大后驗概率,然后判斷其所屬的類別:
???? 以上就是樸素貝葉斯的基本原理。下面基于numpy和pandas來實現樸素貝葉斯算法。
導入package:
import numpy as np import pandas as pd創建示例數據集:
x1 = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3] x2 = ['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L'] y = [-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]df = pd.DataFrame({'x1':x1, 'x2':x2, 'y':y}) df.head()取出特征和標簽:
X = df[['x1', 'x2']] y = df[['y']]定義樸素貝葉斯訓練過程:
def nb_fit(X, y):classes = y[y.columns[0]].unique()class_count = y[y.columns[0]].value_counts()class_prior = class_count/len(y)prior = dict()for col in X.columns:for j in classes:p_x_y = X[(y==j).values][col].value_counts()for i in p_x_y.index:prior[(col, i, j)] = p_x_y[i]/class_count[j]return classes, class_prior, prior擬合示例如下:
最后定義預測函數:
def predict(X_test):res = []for c in classes:p_y = class_prior[c]p_x_y = 1for i in X_test.items():p_x_y *= prior[tuple(list(i)+[c])]res.append(p_y*p_x_y)return classes[np.argmax(res)]給定測試實例并進行預測:
X_test = {'x1': 2, 'x2': 'S'} classes, class_prior, prior = nb_fit(X, y) print('測試數據預測類別為:', predict(X_test))最后也可以定義一個Naive_Bayes的類對上述過程進行封裝:
import numpy as np import pandas as pdclass Naive_Bayes:def __init__(self):pass# 樸素貝葉斯訓練過程def nb_fit(self, X, y):classes = y[y.columns[0]].unique()class_count = y[y.columns[0]].value_counts()# 類先驗概率class_prior = class_count / len(y)# 計算類條件概率prior = dict()for col in X.columns:for j in classes:p_x_y = X[(y == j).values][col].value_counts()for i in p_x_y.index:prior[(col, i, j)] = p_x_y[i] / class_count[j]return classes, class_prior, prior# 預測新的實例def predict(self, X_test):res = []for c in classes:p_y = class_prior[c]p_x_y = 1for i in X_test.items():p_x_y *= prior[tuple(list(i) + [c])]res.append(p_y * p_x_y)return classes[np.argmax(res)]if __name__ == "__main__":x1 = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]x2 = ['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L']y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]df = pd.DataFrame({'x1': x1, 'x2': x2, 'y': y})X = df[['x1', 'x2']]y = df[['y']]X_test = {'x1': 2, 'x2': 'S'}nb = Naive_Bayes()classes, class_prior, prior = nb.nb_fit(X, y)print('測試數據預測類別為:', nb.predict(X_test))???? 以上就是本節內容,下一講我們來看看貝葉斯分類的另一種形態——貝葉斯網絡。完整代碼文件和數據可參考筆者GitHub地址:
https://github.com/luwill/machine-learning-code-writing
參考資料:
https://github.com/SmirkCao/Lihang
李航 統計學習方法
往期精彩:
數學推導+純Python實現機器學習算法10:線性不可分支持向量機
數學推導+純Python實現機器學習算法8-9:線性可分支持向量機和線性支持向量機
數學推導+純Python實現機器學習算法6:感知機
數學推導+純Python實現機器學習算法5:決策樹之CART算法
數學推導+純Python實現機器學習算法4:決策樹之ID3算法
數學推導+純Python實現機器學習算法3:k近鄰
數學推導+純Python實現機器學習算法2:邏輯回歸
數學推導+純Python實現機器學習算法1:線性回歸
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:總結
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习基础】数学推导+纯Python
- 下一篇: 吴恩达家免费NLP课程上线啦!