机器学习之朴树贝叶斯①——(思想及典型例题底层实现)

坚强是说给别人听的谎言 提交于 2019-11-27 07:19:27

先验概率、后验概率(条件概率)引例

  • 想象有 A、B、C 三个不透明的碗倒扣在桌面上,已知其中一个瓷碗下面有鸡蛋。此时请问,鸡蛋在 A 碗下面的概率是多少?答曰 1/3。
  • 现在发生一件事:有人揭开了 C 碗,发现 C 碗下面没有蛋。此时再问:鸡蛋在 A 碗下面的概率是多少?答曰 1/2。注意,由于有“揭开C碗发现鸡蛋不在C碗下面”这个新情况,对于“鸡蛋在 A 碗下面”这件事的主观概率由原来的 1/3 上升到了1/2。这里的 先验概率 就是 1/3,后验概率(条件概率) 是 1/2。

乘法公式、全概率公式、贝叶斯公式

  • 条件概率
    设A,B为任意两个事件,若P(A)>0,我们称在已知事件A发生的条件下,事件B发生的概率为条件概率,记为P(B|A),并定义
    在这里插入图片描述
  • 乘法公式
    如果P(A)>0,则P(AB)=P(A)P(B|A)
    如果P(A1…An-1)>0,则P(A1…An)= P(A1) P(A2|A1) P(A3|A1A2)…P(An|A1…An)

全概率公式
在这里插入图片描述
在这里插入图片描述

  • 全概率公式是用于计算某个“结果” B发生的可能性大小。如果一个结果B的发生总是与某些前提条件Ai 相联系,那么在计算P(B)时,我们就要用Ai 对B作分解,应用全概率公式计算P(B),我们常称这种方法为全集分解法

  • 根据小偷们的资料,计算村子今晚失窃概率的问题:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷 i 作案成功的概率,那么P(B)就是村子失窃的概率


贝叶斯公式(又称逆概公式)
在这里插入图片描述

  • 如果在B发生的条件下探求导致这一结果的各种“原因” Aj 发生的可能性大小P(Aj |B),则要应用贝叶斯公式
  • 若村子今晚失窃,计算哪个小偷嫌疑最大的问题(嫌疑最大就是后验概率最大)
    在这里插入图片描述在这里插入图片描述

朴素贝叶斯为何朴素

  • 条件独立、概率不准确

  • 因为它假定所有的特征在数据集中的作用是同样重要和独立的,正如我们所知,这个假设在现实世界中是很不真实的,因此,说是很“朴素的”。

  • 朴素贝叶斯中的“朴素”二字突出了这个算法的简易性。朴素贝叶斯的简易性表现该算法基于一个很朴素的假设:所有的变量都是相互独立的,假设各特征之间相互独立,各特征属性是条件独立的。

朴素贝叶斯定义

  • 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 。最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。

  • 贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。

朴素贝叶斯直观理解

在这里插入图片描述
在这里插入图片描述

朴素的意义

在这里插入图片描述

拉普拉斯平滑

在这里插入图片描述

手写代码

在这里插入图片描述

数据集
    X1 X2  Y
0    1  S -1
1    1  M -1
2    1  M  1
3    1  S  1
4    1  S -1
5    2  S -1
6    2  M -1
7    2  M  1
8    2  L  1
9    2  L  1
10   3  L  1
11   3  M  1
12   3  M  1
13   3  L  1
14   3  L -1
import pandas as pd
import numpy as np

def tokey(col_name, category, y):  # 定义写key的函数,比如产生 'X1=3|Y=1'
    return col_name + "=" + str(category) + "|Y=" + str(y)

df = pd.read_csv("../../datas/bayes_lihang.txt")
lam = 1  							# 平滑因子

P = {}  							# 用于存储所有概率的字典

Y = df["Y"].value_counts().keys()  # 获取类别种类的list
print(Y)

col_names = df.columns.tolist()[:-1]  # 获取特征列名
print(col_names)

for y in Y:  						# 遍历每个类别
    df2 = df[df["Y"] == y]  		# 获取每个类别下的DF
    p = (df2.shape[0] + lam) / (df.shape[0] + len(Y) * lam)  # 计算先验概率
    P[y] = p  						# 将先验概率加入P

    for col_name in col_names:  	# 遍历每个特征
        categorys = df2[col_name].value_counts().keys()  # 获取每个特征下特征值种类的list

        for category in categorys:  # 遍历每个特征值
            p = (df2[df2[col_name] == category].shape[0] + lam) / (
                    df2.shape[0] + len(categorys) * lam)  	# 计算在某类别下,特征=某特征的条件概率
            P[tokey(col_name, category, y)] = p  			# 将条件概率加到P
            
print(P)

X = [2, "S"]  					# 待测数据

res = []  						# 用于存储属于某一类别的后验概率

for y in Y:  					# 遍历类别
    p = P[y]  					# 获取先验概率
    for i in range(len(X)):  	# 遍历特征
        p *= P[tokey(col_names[i], X[i], y)]  		# 获取条件概率
    res.append(p)  				# 将后验概率加入res
    print(p)

print(Y[np.argmax(res)])  		# 返回最大的后验概率对应的类别
显现效果
Int64Index([1, -1], dtype='int64')
['X1', 'X2']
{1: 0.5882352941176471, 'X1=3|Y=1': 0.4166666666666667, 'X1=2|Y=1': 0.3333333333333333, 'X1=1|Y=1': 0.25, 'X2=M|Y=1': 0.4166666666666667, 'X2=L|Y=1': 0.4166666666666667, 'X2=S|Y=1': 0.16666666666666666, -1: 0.4117647058823529, 'X1=1|Y=-1': 0.4444444444444444, 'X1=2|Y=-1': 0.3333333333333333, 'X1=3|Y=-1': 0.2222222222222222, 'X2=S|Y=-1': 0.4444444444444444, 'X2=M|Y=-1': 0.3333333333333333, 'X2=L|Y=-1': 0.2222222222222222}
0.0326797385620915
0.06100217864923746
-1
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!