贝叶斯定理
贝叶斯定理:表达了一个事件发生的概率,而确定这一概率的方法是基于与该事件相关的条件先验知识。条件概率是指在事件B发生的情况下,事件A发生的概率。通常记为 P(A|B)
P(A|B) =
P
(
A
)
∗
P
(
B
∣
A
)
P
(
B
)
\displaystyle\frac{P(A) * P(B|A) }{P(B)}
P(B)P(A)∗P(B∣A)
p(A):称为 “先验概率”,即事件B发生之前,对A事件概率的一个判断。
P(A|B):已知B发生后A的条件概率,也由于得自B的取值而被称作A的 “后验概率”。
P(B|A):已知A发生后B的条件概率,也由于得自A的取值而被称作B的 “后验概率”。
P(B):是B的 “先验概率”,也称作 “标准化常量”"。
贝叶斯定理可表述为:
后验概率 = (相似度 * 先验概率) / 标准化常量
另外,比例P(B|A)/P(B)也有时被称为标准相似度,贝叶斯定理也可表述为:
后验概率 = 标准相似度 * 先验概率
朴素贝叶斯
基于贝叶斯定理来估计后验概率P(A|B) 的主要困难在于:类条件概率P(B|A) 是所有属性上的联合概率,难以从有限的训练样本直接估计而得。
为避开这个障碍,朴素贝叶斯分类器采用 了 “属性条件独立性假设”:对已知类别,假设所有属性相对独立。换言之,假设每个属性独立对分类结果发生影响。
基于条件属性独立假设:
P
(
c
∣
x
)
=
P
(
c
)
P
(
x
∣
c
)
P
(
x
)
=
P
(
x
)
P
(
c
)
∏
i
=
1
d
P
(
x
i
∣
c
)
P(c|x) = \displaystyle\frac{P(c)P(x|c)}{P(x)} = \frac{P(x)}{P(c)}\prod_{i=1}^dP(x_i|c)
P(c∣x)=P(x)P(c)P(x∣c)=P(c)P(x)i=1∏dP(xi∣c)
d: 属性数目
xi:x在第i个属性上的取值
对所有类别来说P(x)相同,因此基于以上贝叶斯判定准则有朴素贝叶斯分类器表达式:
h
n
b
(
x
)
=
a
r
g
max
c
∈
y
P
(
c
)
∏
i
=
1
d
P
(
x
i
∣
c
)
h_{nb}(x) = \displaystyle{\underset {c \in y}{\operatorname{arg\max}}}P(c)\prod_{i=1}^{d}P(x_i|c)
hnb(x)=c∈yargmaxP(c)i=1∏dP(xi∣c)
朴素贝叶斯分类器训练过程是基于训练集D来估计类先验概率
P
(
c
)
P(c)
P(c),并为每个属性估计条件概率
P
(
x
i
∣
c
)
P(x_i|c)
P(xi∣c)
另Dc表示训练集D中第c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
P
(
c
)
=
∣
D
c
∣
∣
D
∣
P(c) = \displaystyle\frac{|D_c|}{|D|}
P(c)=∣D∣∣Dc∣
对离散属性而言,令
D
c
D_c
Dc,
x
i
x_i
xi表示
D
c
D_c
Dc中的第i个属性上取值为
x
i
x_i
xi的样本组成的集合,则条件概率
P
(
x
i
∣
c
)
P(x_i|c)
P(xi∣c)可估计为
P
(
x
i
∣
c
)
=
∣
D
c
,
x
i
∣
∣
D
c
∣
P(x_i|c) = \displaystyle\frac{|D_c,x_i|}{|D_c|}
P(xi∣c)=∣Dc∣∣Dc,xi∣
对连续属性可考虑概率密度函数,假定
P
(
x
i
∣
c
)
∼
N
(
μ
c
,
i
,
σ
c
,
i
2
)
P(x_i|c)\sim N(\mu_{c,i},\sigma_{c,i}^2)
P(xi∣c)∼N(μc,i,σc,i2),其中
μ
c
,
i
和
\mu_{c,i}和
μc,i和
σ
c
,
i
2
\sigma_{c,i}^2
σc,i2分别为第c类样本在第i个属性上取值的均值和方差,则有:
P
(
x
i
∣
c
)
=
1
2
π
σ
c
,
i
exp
(
−
(
x
i
−
μ
c
,
i
)
2
2
σ
c
,
i
2
)
P(x_i|c) = \displaystyle\frac{1}{\sqrt{2\pi\sigma_{c,i}}}\exp{(-\frac{(x_i-\mu_{c,i})^2}{2\sigma_{c,i}^2})}
P(xi∣c)=2πσc,i1exp(−2σc,i2(xi−μc,i)2)
为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”。
另N表示训练集D中可能的类别数,Ni表示第i个属性可能的取值数
P
(
c
)
=
∣
D
c
∣
+
1
∣
D
∣
+
N
P(c) = \displaystyle\frac{|D_c|+1}{|D|+N}
P(c)=∣D∣+N∣Dc∣+1
P ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i P(x_i|c) = \displaystyle\frac{|D_c,x_i|+1}{|D_c|+N_i} P(xi∣c)=∣Dc∣+Ni∣Dc,xi∣+1
朴素贝叶斯工作流程图
核心代码
以下代码是属于二分类的分类代码,如果有多分类可以根据需求修改
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix);#输入文档矩阵数目
numWords = len(trainMatrix[0]);#计算输入每篇文档词条数
pAbusive = sum(trainCategory) / float(numTrainDocs); #文档属于P1类的概率
p0Num = np.zeros(numWords); p1Num = np.zeros(numWords); #创建一个以0填满的数组
p0Denom = 0.0; p1Denom = 0.0; #分母初始化为0
for i in range(numTrainDocs):
if trainCategory[i] == 1: #统计属于类型1的的条件概率需要的数据,即p(w0|1), p(w1|1)
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:#统计属于类型0的的条件概率需要的数据,即p(w0|0), p(w1|0)
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = p1Num/p1Denom
p0Vect = p0Num/p0Denom
return p0Vect, p1Vect, pAbusive #返回属性1的条件概率数组,属于属性0的条件概率数组,文档概率
代码分析:
1.输入两个参数:训练文档矩阵,训练类别标签
2.计算每个文档中的文档数目
3.首先计算出文档属于属性1的概率,即p(1)
4.计算p(wi|c1)和p(wi|c0),需要初始化程序中的分子和分母变量
5.根据文档中词条出现类型,分类将数据累加,得到总词数
6.返回类型1,类型0总词条数以及类型1的概率
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):#分类函数
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0-pClass1)
if p1 > p0:
return 1
else:
return 0
代码分析:
1.使用函数trainNB0返回的三个概率,以及要分类的vec2Classify传入函数
2.用numpy的数组计算两个向量相乘的结果,再将词汇表中的所有词对应值相加,加到对应类别的概率上
3.返回比较类别概率大的对应标签
朴素贝叶斯算法
优点: 在数据少的情况下仍然有效,可以处理多类别问题
缺点: 对于输入数据的准备方式较为敏感
适用数据类型: 标称型数据