机器学习 — 贝叶斯分类算法



一,贝叶斯理论

假设现在我们有一个数据集,它由两类数据组成,数据分布如下图所示:

在这里插入图片描述
我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率,用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率,那么对于一个新数据点(x,y),可以用下面的规则来判断它的类别:

  • 如果p1(x,y)>p2(x,y),那么类别为1
  • 如果p1(x,y)<p2(x,y),那么类别为2

也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

二,条件概率

在学习计算p1 和p2概率之前,我们需要了解什么是条件概率(Conditional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示
在这里插入图片描述
根据文氏图,可以很清楚地看到在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)/𝑃(𝐵)

因此,

𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵)

同理可得,

𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)

𝑃(𝐴|𝐵)=𝑃(B|A)𝑃(𝐴)/𝑃(𝐵)

这就是条件概率的计算公式

三,全概率公式

除了条件概率以外,在计算p1和p2的时候,还要用到全概率公式,因此,这里继续推导全概率公式。

假定样本空间S,是两个事件A与A’的和。

在这里插入图片描述

上图中,红色部分是事件A,绿色部分是事件A’,它们共同构成了样本空间S。

在这种情况下,事件B可以划分成两个部分。

在这里插入图片描述

𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′)

在上面的推导当中,我们已知

𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)

所以:

𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′)

这就是全概率公式。它的含义是,如果A和A’构成样本空间的一个划分,那么事件B的概率,就等于A和A’的概率分别乘以B对这两个事件的条件概率之和。

将这个公式代入上一节的条件概率公式,就得到了条件概率的另一种写法:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ∣ A ) P ( A ) + P ( B ∣ A , ) P ( A , ) P(A|B)=\frac{P(B|A)P(A)}{P(B|A)P(A)+P(B|A^,)P(A^,)} P(AB)=P(BA)P(A)+P(BA,)P(A,)P(BA)P(A)

四,贝叶斯推断

对条件概率公式进行变形,可以得到如下形式:

在这里插入图片描述

我们把P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。

P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

所以,条件概率可以理解成下面的式子:

后验概率 = 先验概率x调整因子

这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。
在这里插入图片描述

五,朴素贝叶斯推断

理解了贝叶斯推断,那么让我们继续看看朴素贝叶斯。贝叶斯和朴素贝叶斯的概念是不同的,区别就在于“朴素”二字,朴素贝叶斯对条件概率分布做了条件独立性的假设。 比如下面的公式,假设有n个特征:

根据贝叶斯定理,后验概率 P(a|X) 可以表示为:

P ( a ∣ X ) = P ( X ∣ a ) P ( a ) P ( X ) P(a|X) = \frac{P(X|a)P(a)}{P(X)} P(aX)=P(X)P(Xa)P(a)

其中:

  • P(X|a) 是给定类别 ( a ) 下观测到特征向量 $X=(x_1, x_2, …, x_n) $的概率;
  • P(a) 是类别 a 的先验概率;
  • P(X) 是观测到特征向量 X 的边缘概率,通常作为归一化常数处理。

朴素贝叶斯分类器的关键假设是特征之间的条件独立性,即给定类别 a ,特征 x i x_i xi x j x_j xj (其中 i ≠ j i \neq j i=j 相互独立。)

因此,我们可以将联合概率 P(X|a) 分解为各个特征的概率乘积:

P ( X ∣ a ) = P ( x 1 , x 2 , . . . , x n ∣ a ) = P ( x 1 ∣ a ) P ( x 2 ∣ a ) . . . P ( x n ∣ a ) P(X|a) = P(x_1, x_2, ..., x_n|a) = P(x_1|a)P(x_2|a)...P(x_n|a) P(Xa)=P(x1,x2,...,xna)=P(x1a)P(x2a)...P(xna)

将这个条件独立性假设应用于贝叶斯公式,我们得到:

P ( a ∣ X ) = P ( x 1 ∣ a ) P ( x 2 ∣ a ) . . . P ( x n ∣ a ) P ( a ) P ( X ) P(a|X) = \frac{P(x_1|a)P(x_2|a)...P(x_n|a)P(a)}{P(X)} P(aX)=P(X)P(x1a)P(x2a)...P(xna)P(a)

这样,朴素贝叶斯分类器就可以通过计算每种可能类别的条件概率和先验概率,然后选择具有最高概率的类别作为预测结果。

  • 示例
纹理 色泽 鼔声 类别
1 清晰 清绿 清脆 好瓜
2 模糊 乌黑 浊响 坏瓜
3 模糊 清绿 浊响 坏瓜
4 清晰 乌黑 沉闷 好瓜
5 清晰 清绿 浊响 好瓜
6 模糊 乌黑 沉闷 坏瓜
7 清晰 乌黑 清脆 好瓜
8 模糊 清绿 沉闷 好瓜
9 清晰 乌黑 浊响 坏瓜
10 模糊 清绿 清脆 好瓜
11 清晰 清绿 沉闷
12 模糊 乌黑 浊响 ?
p(a|X) = p(X|a)* p(a)/p(X)  #贝叶斯公式
p(X|a) = p(x1,x2,x3...xn|a) = p(x1|a)*p(x2|a)*p(x3|a)...p(xn|a)
p(X) = p(x1,x2,x3...xn) = p(x1)*p(x2)*p(x3)...p(xn)
p(a|X) = p(x1|a)*p(x2|a)*p(x3|a)...p(xn|a) * p(a) / p(x1)*p(x2)*p(x3)...p(xn)  #朴素贝叶斯公式

P(好瓜)=(好瓜数量)/所有瓜
P(坏瓜)=(坏瓜数量)/所有瓜
p(纹理清晰)=(纹理清晰数量)/所有瓜
p(纹理清晰|好瓜)= 好瓜中纹理清晰数量/好瓜数量
p(纹理清晰|坏瓜)= 坏瓜中纹理清晰数量/坏瓜数量

p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)
	=【p(好瓜)】*【p(纹理清晰,色泽清绿,鼓声沉闷|好瓜)】/【p(纹理清晰,色泽清绿,鼓声沉闷)】
	=【p(好瓜)】*【p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】

p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)
	=【p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】

从公式中判断"p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)"和"p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)"时,因为它们的分母
值是相同的,[值都是p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)],所以只要计算它们的分子就可以判断是"好瓜"还是"坏瓜"之间谁大谁小了,所以没有必要计算分母
p(好瓜) = 6/10
p(坏瓜)=4/10
p(纹理清晰|好瓜) = 4/6 
p(色泽清绿|好瓜) = 4/6
p(鼓声沉闷|好瓜) = 2/6
p(纹理清晰|坏瓜) = 1/4 
p(色泽清绿|坏瓜) = 1/4
p(鼓声沉闷|坏瓜) = 1/4
把以上计算代入公式的分子
p(好瓜)*p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜) = 4/45
p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜) = 1/160
所以
p(好瓜|纹理清晰,色泽清绿,鼓声沉闷) >  p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷),
所以把(纹理清晰,色泽清绿,鼓声沉闷)的样本归类为好瓜

六,拉普拉斯平滑系数

某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。然而,在实际应用中,即使某个事件或特征没有出现在训练集中,也不能完全排除它在未来样本中出现的可能性。拉普拉斯平滑技术可以避免这种“零概率陷阱”

公式为:
请添加图片描述

一般α取值1,m的值为总特征数量

通过这种方法,即使某个特征在训练集中从未出现过,它的概率也不会被估计为零,而是会被赋予一个很小但非零的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误

比如计算判断新瓜(纹理清晰,色泽淡白,鼓声沉闷)是好和坏时,因为在样本中色泽淡白没有出现,导致出现0值,会影响计算结果,要采用拉普拉斯平滑系数

p(好瓜|纹理清晰,色泽淡白,鼓声沉闷)
	=【p(好瓜)】*【p(纹理清晰|好瓜)*p(色泽淡白|好瓜)*p(鼓声沉闷|好瓜)】/【p(纹理清晰)*p(色泽淡白)*p(鼓声沉闷)】
p(坏瓜|纹理清晰,色泽淡白,鼓声沉闷)
	=【p(坏瓜)】*【p(纹理清晰|坏瓜)*p(色泽淡白|坏瓜)*p(鼓声沉闷|坏瓜)】/【p(纹理清晰)*p(色泽淡白)*p(鼓声沉闷)】   
p(纹理清晰|好瓜)= (4+1)/(6+3)  # +1是因为防止零概率 +3是因为有3个特征(纹理,色泽,鼓声)
p(色泽淡白|好瓜)= (0+1)/(6+3)  
p(鼓声沉闷|好瓜) = (2+1)/(6+3) 
p(纹理清晰|坏瓜)= (1+1)/(4+3)   
p(色泽淡白|坏瓜)= (0+1)/(4+3)  
p(鼓声沉闷|坏瓜) = (1+1)/(4+3)  

七,鸢尾花数据集示例

from sklearn.datasets import load_iris
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split


def train():
    iris = load_iris()
    x = iris.data
    y = iris.target
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=22)
    #创建贝叶斯模型
    model = MultinomialNB()
    #使用训练集训练模型
    model.fit(x_train,y_train)
    #测试集的预测结果
    y_pred = model.predict(x_test)
    print("预测结果:",y_pred)
    #计算准确率
    score = model.score(x_test,y_test)
    print("准确率:",score)

if __name__ == '__main__':
    train()
    
预测结果: [0 2 1 1 1 1 1 1 1 0 2 1 1 2 0 1 1 1 1 1 0 1 0 1 2 0 1 1 1 1]
准确率: 0.6666666666666666

八,葡萄酒数据集示例

from sklearn.datasets import load_wine
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split

def train():
    # 加载葡萄酒数据集
    wine = load_wine()
    x = wine.data
    y = wine.target
    
    # 划分训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)
    
    # 创建贝叶斯模型
    model = MultinomialNB()
    
    # 使用训练集训练模型
    model.fit(x_train, y_train)
    
    # 测试集的预测结果
    y_pred = model.predict(x_test)
    print("预测结果:", y_pred)
    
    # 计算准确率
    score = model.score(x_test, y_test)
    print("准确率:", score)

if __name__ == '__main__':
    train()
预测结果: [1 1 1 2 0 1 0 1 1 1 1 1 0 0 1 0 0 0 2 2 1 1 2 1 1 0 1 1 2 2 1 0 1 1 0 2]
准确率: 0.8333333333333334
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐