朴素贝叶斯

条件几率

•设A,B为任意两个事件,若P(A)>0,咱们称在已知事件A发生的条件下,事件B发生的几率为条件几率,记为P(B|A),并定义算法

 

乘法公式

•若是P(A)>0,则P(AB)=P(A)P(B|A)app

•若是P(A1…An-1)>0,则P(A1…An)= P(A1) P(A2|A1) P(A3|A1A2)…P(An|A1…An-1)机器学习

全几率公式

 

 

•P(Ai)>0,则对任一事件B,有函数

 

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

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

贝叶斯公式(又称逆概公式)code

 

P(Ai)>0,则对任一事件B,只要P(B)>0,有blog

 

 

•若是在B发生的条件下探求致使这一结果的各类“缘由” Aj 发生的可能性大小P(Aj |B),则要应用贝叶斯公式事件

若村子今晚失窃,计算哪一个小偷嫌疑最大的问题(嫌疑最大就是后验几率最大)pandas

假设小偷1和小偷2在某村庄的做案数量比为3:2,前者偷窃成功的几率为0.02,后者为0.01,现村庄失窃,求此次失窃是小偷1做案的几率。

【分析】A1={小偷1做案},A2={小偷2做案},B={村庄失窃}

 

 

总结:

先验几率P(A):在不考虑任何状况下,A事件发生的几率条件几率P(B|A):A事件发生的状况下,B事件发生的几率后验几率P(A|B):在B事件发生以后,对A事件发生的几率的从新评估全几率:若是A和A'构成样本空间的一个划分,那么事件B的几率为:A和A'的几率分别乘以B对这两个事件的几率之和。

朴素贝叶斯的直观理解

案例:

有一个训练集包含100我的,其中有60个非洲人(黑卷47,黑直1,黄卷11,黄直1),有40个亚洲人(黑卷1,黄卷4,黄直*35),请训练朴素贝叶斯模型。

肤色x1={黑,黄}, 发型x2={卷,直}; 地区label={亚,非}

先计算先验几率:

亚洲人的比例m,非洲人的比例

 

模型构建:根据资料计算模型参数

亚洲人中肤色=黑的比例,亚洲人中肤色=黄的比例

 

非洲人中肤色=黑的比例,非洲人中肤色=黄的比例

 

亚洲人中发型=卷的比例,亚洲人中发型=直的比例

 

非洲人中发型=卷的比例,非洲人中发型=直的比例

 

假设新来了一我的【[黑,卷],地区=?】,请用朴素贝叶斯模型预测这我的的地区。Y表示地区,X表示特征向量,根据贝叶斯公式,并假设特征间独立的假设有:

 

和特征间独立的假设(朴素),得

 

根据计算结果,模型会将这我的的地区预测为非洲。

朴素:假设特征间是独立的(忽略肤色和发型的联系),从而变成了“低配版的贝叶斯模型”,称为“朴素贝叶斯”。

优势:是能够减小须要估计的参数的个数;缺点:会牺牲必定的分类准确率。

若是是贝叶斯模型的话,模型参数总数为:

 

是指数增加的,实际是不可行的;而朴素贝叶斯模型参数总数为:

 

经过朴素贝叶斯就能够避免线性增加。

训练:先根据数据集,计算标记(地区)的先验几率,再计算每个特征(肤色和发型)的条件几率,这些几率值就是模型参数,所以朴素贝叶斯的训练成本很低。

预测:当一个【黑,卷】来报道时,假设特征间是独立的,朴素贝叶斯模型会预测他的老家是非洲的,原理就是

“非洲人的几率 非洲人里肤色为黑的比例 非洲人里发型为卷的比例 > 亚洲人的几率 亚洲人里肤色为黑的比例 亚洲人里发型为卷的比例”。

朴素贝叶斯模型会将实例预测为后验几率最大的类。

继续上文的引例,考虑一个这样的问题:

假设某人的地区彻底依靠其肤色的就能肯定,发型是一个对判断地区没有参考价值的特征,假设P(卷|非洲)=0, P(卷|亚洲)=0.001,当来了一个【黑,卷】人的时候,咱们算出

而后被预测为亚洲人,傻了吧?

缘由:出现某个模型参数为0时,0乘任何数都=0,直接影响到后验几率的计算结果。

解决这一问题的方法是使用平滑操做,改造先验几率公式:

 

改造每一个特征的条件几率公式(这里只列举了2个):

 

在随机变量各个取值的频数上赋予一个正数,当λ=1时,称为拉普拉斯平滑

 

 

拉普拉斯平滑

 

 

17: 15+2 (拉普拉斯平滑)

10: 9+1 (拉普拉斯平滑)

代码实现

import pandas as pd
​
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
col_names = df.columns.tolist()[:-1] #获取特征列名
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)]  #获取条件几率
    print(p)
    res.append(p)  #将后验几率加入res
    
import numpy as np
np.argmax(res) #返回最大的后验几率对应的类别

 

多项式朴素贝叶斯:

当特征是离散变量时,使用多项式模型

高斯朴素贝叶斯:

当特征是连续变量时,使用高斯模型

伯努利朴素贝叶斯:

伯努利模型和多项式模型是一致的,但要求特征是二值化的(1,0)

注意:当特征中既有连续变量又有离散变量时,通常将连续变量离散化后使用多项式模型

•在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强独立(朴素)下运用贝叶斯定理为基础的简单几率分类器。

•高度可扩展的,求解过程只需花费线性时间

•目前来讲,朴素贝叶斯在文本分类(textclassification)的领域的应用多,不管是sklearn仍是Spark Mllib中,都只定制化地实现了在文本分类领域的算法

相关文章
相关标签/搜索