朴素贝叶斯

1 概念

  • 朴素贝叶斯是一种直接衡量标签和特征之间的概率关系有监督学习算法,是一种专注分类的算法。朴素贝叶斯的算法根源是基于概率论和数理统计的贝叶斯理论
  • 如,求 \(P(Y=是|X_1=零下,X_2=一个月)\)。如果 \(P>0.5\) 则分类为“是”,否则为“否”。(实质是计算在同一个样本集下,满足条件的概率最大的结果)
索引 温度(\(X_1\) 瓢虫的年龄(\(X_2\) 瓢虫冬眠(\(Y\)
0 零下 10天
1 零下 20天
2 零上 10天
3 零下 一个月
4 零下 20天
5 零上 两个月
6 零下 一个月
7 零下 两个月
8 零上 一个月
9 零上 10天
10 零下 20天

2 数学基础

  • 联合概率:\(X\) 取值为 \(x\)\(Y\) 取值为 \(y\),两件事同时发生的概率。记为 \(P(X=x, Y=y)\)

  • 条件概率:在 \(X\) 取值为 \(x\) 的前提下,\(Y\) 取值为 \(y\) 的概率。记为 \(P(Y=y | X=x)\)

  • 条件概率公式:

    \[P(Y|X)=\frac{P(AB)}{P(A)} \]

  • 贝叶斯公式:

    \[P(Y|X)=\frac{P(X|Y)\times P(Y)}{P(X)} \tag 1 \]

  • 粗体的 \(P(\mathbf{X})\) 表示取所有特征值的概率:(多个特征多个取值)

\[P(\mathbf{X})=P(X_1=x1,...,X_n=x_n) \]

  • 假设特征 \(X_i\) 之间是有条件独立的(朴素)。则在 \(Y=1\) 的条件下,多个特征的取值被同时取到的概率,就等于 \(Y=1\) 的条件下,多个特征的取值被分别取到的概率相乘:

    \[P(\mathbf{X}|Y=1)=\prod_{i=1}^nP(X_i|Y=1) \tag 2 \]

  • 全概率公式:

\[P(\mathbf{X})=\sum_{i=1}^mP(Y_i)\times P(\mathbf{X}|Y_i) \]

  • 对于二分类问题,我们需要的是 \(P(Y=1|\mathbf{X})\) 。即,所有特征 \(X\) 取一定值的条件下,\(Y\) 等于1的概率。若大于0.5,则分类为1;否则为0。由公式(1)和(2)有:

    \[P(Y=1|\mathbf{X})=\frac{ \prod_{i=1}^nP(X_i|Y=1) \times P(Y=1)}{P(\mathbf{X})} \tag3 \]

  • 由于计算全概率 \(P(\mathbf{X})\) 更困难,而 \(P(Y=1|\mathbf{X})+P(Y=0|\mathbf{X})=1\) 。所以只需计算 \(P(Y=1|\mathbf{X})\)\(P(Y=1|\mathbf{X})\) 的分子之和,即为 \(P(\mathbf{X})\)

3 连续型变量的概率估计

  • 概率公式:

\[P(x_i<x<x_i+\epsilon)=\int_{x_i}^{x_i+\epsilon}f(x)dx \approx f(x_i) \times \epsilon \]

  • 如正态分布中,整个图形的面积为1,\(P(x_i<x<x_i+\epsilon)\) 就等于 \(x_i\)\(x_i+\epsilon\) 的图形面积:

查看源图像

  • 最后的每个概率都乘了 \(\epsilon\) ,可以约掉。所以只需计算 \(f(x_i)\) 即可。
  • 只需找到对应的 \(f(x)\) 满足 \(\int_{-\infty}^{\infty}f(x)dx=1\) (即图形面积为1)。如:高斯(正态)分布、伯努利分布、多项式分布等。根据实际情况,选用合适的分布函数,即可求出连续型变量的概率。

4 高斯朴素贝叶斯

  • 假设 \(P(x_i|Y)\) 服从高斯分布(正态分布):

\[\begin{align} P(x_i|Y) &=f(x_i;\mu_y,\sigma_y) \times \epsilon \\ &=\frac{1}{\sqrt{2\pi\sigma_y^2}} \exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2}) \end{align} \]

  • 依据训练数据集,以最大化 \(P(x_i|Y)\) 为目标,求解参数 \(\sigma_y\)\(\mu_y\) (就是模型fit的过程)。
  • 有了参数,就可以计算所有的 \(P(x_i|Y)\) 。再根据公式(3)即可得到分类结果。
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits               #手写数字数据集
from sklearn.model_selection import train_test_split

digits = load_digits()
X, y = digits.data, digits.target
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size = 0.3, random_state = 420)

gnb = GaussianNB().fit(Xtrain, Ytrain)
acc_score = gnb.score(Xtest, Ytest)          #返回预测的精确性accuracy
acc_score
posted @ 2020-11-20 17:25  woldcn  阅读(190)  评论(0)    收藏  举报