1、贝叶斯方法
- 几个概念
(1)先验概率:根据以往经验和分析得到的概率。我们用 P ( Y ) P(Y) P(Y) 来代表在没有训练数据前假设 Y Y Y 拥有的初始概率。
(2)后验概率:根据已经发生的事件来分析得到的概率。以 P ( Y ∣ X ) P(Y|X) P(Y∣X) 表假设 X X X 成立的情下观察到 Y Y Y 数据的概率,因为它反映了在看到训练数据 X X X 后 Y Y Y 成立的置信度。
(3)联合概率:联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。 X X X 和 Y Y Y 的联合概率表示为 P ( X Y ) P(XY) P(XY)。
- 贝叶斯公式
2、贝叶斯原理
1.朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y),然后求得后验概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X) 。具体来说,利用训练数据学习 P ( X ∣ Y ) P(X|Y) P(X∣Y) 和 P ( Y ) P(Y) P(Y) 的估计,得到联合概率分布:
P ( X , Y ) = P ( Y ) P ( X ∣ Y ) P(X,Y)=P(Y)P(X|Y) P(X,Y)=P(Y)P(X∣Y)
概率估计方法可以是极大似然估计或贝叶斯估计。
2.朴素贝叶斯法的基本假设是条件独立性,
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) \begin{aligned} P(X&=x | Y=c_{k} )=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) \\ &=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned} P(X=x∣Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck)=j=1∏nP(X(j)=x(j)∣Y=ck)
这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。
3.朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。
P
(
Y
∣
X
)
=
P
(
X
,
Y
)
P
(
X
)
=
P
(
Y
)
P
(
X
∣
Y
)
∑
Y
P
(
Y
)
P
(
X
∣
Y
)
P(Y | X)=\frac{P(X, Y)}{P(X)}=\frac{P(Y) P(X | Y)}{\sum_{Y} P(Y) P(X | Y)}
P(Y∣X)=P(X)P(X,Y)=∑YP(Y)P(X∣Y)P(Y)P(X∣Y)
将输入 x x x 分到后验概率最大的类 y y y。
y = arg max c k P ( Y = c k ) ∏ j = 1 n P ( X j = x ( j ) ∣ Y = c k ) y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=x^{(j)} | Y=c_{k}\right) y=argckmaxP(Y=ck)j=1∏nP(Xj=x(j)∣Y=ck)
后验概率最大等价于0-1损失函数时的期望风险最小化。
- 常用模型模型:
- 高斯模型
- 多项式模型
- 伯努利模型
- 注意:
- 离散情况时,某一概率可能为 0 ,这时需要高斯平滑处理。
- 离散情况时,分母为常数,可以不代入计算,直接计算比较分子。
3、实例:鸢尾花数据集实现贝叶斯分类
# @Time : 2021/12/8 10:22
# @Author : xiao cong
# @Function : 鸢尾花数据集实现朴素贝叶斯分类
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split # 划分训练集和测试集
from sklearn.naive_bayes import GaussianNB
def create_data():
iris = load_iris()
df = pd.DataFrame(iris.data, columns=['sepal length', 'sepal width', 'petal length', 'petal width'])
df["label"] = iris.target
data = np.array(df.iloc[:100, :])
return data[:, :-1], data[:, -1]
X, y = create_data()
X_train, X_test,y_train, y_test = train_test_split(X, y, test_size=0.3) # 0.3 的数据集被划分为测试集
# 直接调用模型
clf = GaussianNB()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
print(clf.predict([[4.4, 3.2, 1.3, 0.2]]))