主要参考学习资料:
《机器学习算法的数学解析与Python实现》莫凡 著
前置知识:概率论与数理统计-Python
博主采用了由浅入深、循序渐进的学习过程,因此本系列不会将内容一次性吃透,而是先整体后细节,后续再探索每个模型更深入的数学知识和具体实现。
目录
数学模型
贝叶斯公式
朴素贝叶斯分类 的核心思想来源于贝叶斯公式:
P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P ( A ) P(B|A)=\displaystyle\frac{P(B)P(A|B)}{P(A)} P(B∣A)=P(A)P(B)P(A∣B)
其由条件概率的公式证得:
P ( B ∣ A ) = P ( A B ) P ( A ) = P ( B ) P ( A ∣ B ) P ( A ) P(B|A)=\displaystyle\frac{P(AB)}{P(A)}=\frac{P(B)P(A|B)}{P(A)} P(B∣A)=P(A)P(AB)=P(A)P(B)P(A∣B)
贝叶斯公式给出了两个事件条件概率间的关系,其实际内涵为支持某项属性的事件发生得愈多,则该属性成立的可能性就愈大。朴素贝叶斯分类利用这一内涵建立了数据的特征与类别之间的关系。
将 B B B看作类别 y y y, A A A看作特征 x x x,相应的贝叶斯公式为:
P ( y ∣ x 1 , ⋯ , x n ) = P ( y ) P ( x 1 , ⋯ , x n ∣ y ) P ( x 1 , ⋯ , x n ) P(y|x_1,\cdots,x_n)=\displaystyle\frac{P(y)P(x_1,\cdots,x_n|y)}{P(x_1,\cdots,x_n)} P(y∣x1,⋯,xn)=P(x1,⋯,xn)P(y)P(x1,⋯,xn∣y)
其中 x 1 , ⋯ , x n x_1,\cdots,x_n x1,⋯,xn表示所有特征同时出现。
由于数据采集总是不完全,且特征 x x x越多问题越明显,要统计所有特征同时出现的概率很难,于是朴素贝叶斯作出了"朴素"的假设,即不同特征之间相互独立,某个特征的似然度就可化简为:
P ( x i ∣ y , x 1 , ⋯ , x i − 1 , x i + 1 , ⋯ , x n ) = P ( x i ∣ y ) P(x_i|y,x_1,\cdots,x_{i-1},x_{i+1},\cdots,x_n)=P(x_i|y) P(xi∣y,x1,⋯,xi−1,xi+1,⋯,xn)=P(xi∣y)
于是求后验概率的方法也简化为:
P ( y ∣ x 1 , ⋯ , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y|x_1,\cdots,x_n)\propto P(y)\displaystyle\prod^n_{i=1}P(x_i|y) P(y∣x1,⋯,xn)∝P(y)i=1∏nP(xi∣y)
采用"正比于"的原因和朴素贝叶斯算法的学习目标有关。朴素贝叶斯算法学习的过程就是不断提高正确类别的似然度的过程,自然达到了提高正确类别后验概率的目的,也无需再统计原式分母特征共同出现的概率。
优化方法
朴素贝叶斯算法的输出结果为:
y ^ = a r g m a x y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat y=\underset{y}{\mathrm{argmax}}P(y)\displaystyle\prod^n_{i=1}P(x_i|y) y^=yargmaxP(y)i=1∏nP(xi∣y)
a r g m a x \mathrm{argmax} argmax返回使得其后函数取得最大值的相应参数。
由此可知,朴素贝叶斯算法并不需要以假设函数和损失函数为基础的优化方法,其学习过程就是查表统计。
算法步骤
①统计样本数据的先验概率 P ( y ) P(y) P(y)和似然度 P ( x ∣ y ) P(x|y) P(x∣y)。
②根据待预测样本所包含的特征,对不同类分别进行后验概率计算。
③比较 y 1 , ⋯ , y n y_1,\cdots,y_n y1,⋯,yn的后验概率,将概率值最大的 y y y作为预测值输出。
代码实现
python
from sklearn.datasets import load_iris
#导入朴素贝叶斯模型中的多项式朴素贝叶斯分类算法
from sklearn.naive_bayes import MultinomialNB
import numpy as np
import matplotlib.pyplot as plt
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
clf = MultinomialNB().fit(X, y)
def plot_decision_boundary(X, y, model):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.coolwarm)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', cmap=plt.cm.coolwarm)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('NBC Decision Boundary')
plt.show()
plot_decision_boundary(X, y, clf)

算法特点
优点:运用统计学成熟理论,可解释性强,对大规模数据集训练效率较高。
缺点:对数据样本的特征维度作了"彼此独立"的假设,如果实际情况并非如此则可能导致预测偏差增加。
应用领域:垃圾邮件等文本分类。