朴素贝叶斯(Naive Bayes)
三门问题
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车, 选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各 藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时 候,节目主持人开启剩下两扇门的其中一扇,露出其中一只 山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。 问题是:换另一扇门会否增加参赛者赢得汽车的机率?
P
(
A
n
)
=
1
3
p
(
B
∣
A
1
)
=
1
2
p
(
B
∣
A
2
)
=
0
p
(
B
∣
A
3
)
=
1
p
(
B
)
=
p
(
B
∣
A
1
)
P
(
A
1
)
+
p
(
B
∣
A
2
)
P
(
A
2
2
)
+
p
(
B
∣
A
2
)
P
(
A
2
)
=
1
2
p
(
A
1
∣
B
)
=
p
(
B
∣
A
1
)
P
(
A
1
)
p
(
B
)
=
1
3
p
(
A
3
∣
B
)
=
p
(
B
∣
A
3
)
P
(
A
3
)
p
(
B
)
=
2
3
P(A_n)=\frac{1}{3}\\ p(B|A_1)=\frac{1}{2} \quad p(B|A_2)=0 \quad p(B|A_3)=1\\ p(B)=p(B|A_1)P(A_1)+p(B|A_2)P(A_22)+p(B|A_2)P(A_2)=\frac{1}{2}\\ p(A_1|B)=\frac{p(B|A_1)P(A_1)}{p(B)}=\frac{1}{3}\\ p(A_3|B)=\frac{p(B|A_3)P(A_3)}{p(B)}=\frac{2}{3}
P(An)=31p(B∣A1)=21p(B∣A2)=0p(B∣A3)=1p(B)=p(B∣A1)P(A1)+p(B∣A2)P(A22)+p(B∣A2)P(A2)=21p(A1∣B)=p(B)p(B∣A1)P(A1)=31p(A3∣B)=p(B)p(B∣A3)P(A3)=32
• 条件概率
• 设A,B为任意两个事件,若P(A)>0,我们称在已知事件A发生的条件下,事件B发生的概率为条件概率,记为P(B|A),并定义
p
(
B
∣
A
)
=
p
(
A
B
)
p
(
A
)
p(B|A)=\frac{p(AB)}{p(A)}
p(B∣A)=p(A)p(AB)
乘法公式
如果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)
全概率公式
如果 ,P(Ai)>0,则对任一事件B,有
p
(
B
)
=
∑
i
=
1
n
p
(
A
i
)
p
(
B
∣
A
i
)
p(B)=\sum_{i=1}^n p(A_i)p(B|A_i)
p(B)=i=1∑np(Ai)p(B∣Ai)
全概率公式是用于计算某个“结果” B发生的可能性大小。如果一个结果B的发生总是与某些前提条件Ai 相联系,那么在计算P(B)时,我们就要用Ai 对B作分解,应用全概率公式计算P(B),我们常称这种方法为全集分解法。
根据小偷们的资料,计算村子今晚失窃概率的问题:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷 i作案成功的概率,那么P(B)就是村子失窃的概率
贝叶斯公式(又称逆概公式)
如果 ,P(Ai)>0,则对任一事件B,只要P(B)>0,有
p
(
A
j
∣
B
)
=
p
(
A
j
B
)
p
(
B
)
=
p
(
B
)
=
p
(
A
j
)
p
(
B
∣
A
j
)
∑
i
=
1
n
p
(
A
i
)
p
(
B
∣
A
i
)
p(A_j|B)=\frac{p(A_jB)}{p(B)}=p(B)=\frac{p(A_j)p(B|A_j)}{\sum_{i=1}^n p(A_i)p(B|A_i)}
p(Aj∣B)=p(B)p(AjB)=p(B)=∑i=1np(Ai)p(B∣Ai)p(Aj)p(B∣Aj)
如果在B发生的条件下探求导致这一结果的各种“原因” Aj 发生的可能性大小P(Aj |B),则要应用贝叶斯公式
若村子今晚失窃,计算哪个小偷嫌疑最大的问题(嫌疑最大就是后验概率最大)
朴素贝叶斯算法推导
特征属性之间是独立的,所以得到
p
(
x
i
∣
y
,
x
1
,
.
.
.
,
x
i
+
1
,
.
.
.
,
x
m
)
=
p
(
x
i
∣
y
)
公式优化得到:
p
(
y
∣
x
1
,
x
2
,
.
.
.
,
x
m
)
=
p
(
y
)
p
(
x
1
,
x
2
,
.
.
,
x
m
∣
y
)
p
(
y
)
p
(
x
1
,
x
2
,
.
.
,
x
m
)
=
p
(
y
)
∏
i
=
1
m
p
(
x
i
∣
y
)
p
(
x
1
,
x
2
,
.
.
,
x
m
)
在给定样本的情况下,
P
(
x
1
,
x
2
,
.
.
.
,
x
m
)
是常数,所以得到:
p
(
y
∣
x
1
,
x
2
,
.
.
.
,
x
m
)
∼
p
(
y
)
∏
i
=
1
m
p
(
x
i
∣
y
)
从而:
y
^
=
a
r
g
y
m
a
x
P
(
y
)
∏
i
=
1
m
p
(
x
i
∣
y
)
p(x_i|y,x_1,...,x_{i+1},...,x_m)=p(x_i|y)\\ 公式优化得到:\\ p(y|x_1,x_2,...,x_m)=\frac{p(y)p(x_1,x_2,..,x_m|y)p(y)}{p(x_1,x_2,..,x_m)}\\= \frac{p(y)\prod_{i=1}^mp(x_i|y)}{p(x_1,x_2,..,x_m)}\\ 在给定样本的情况下,P(x1,x2,...,xm)是常数,所以得到:\\ p(y|x_1,x_2,...,x_m)\sim p(y)\prod_{i=1}^mp(x_i|y)\\ 从而:\\ \hat y=arg_ymaxP(y)\prod_{i=1}^mp(x_i|y)
p(xi∣y,x1,...,xi+1,...,xm)=p(xi∣y)公式优化得到:p(y∣x1,x2,...,xm)=p(x1,x2,..,xm)p(y)p(x1,x2,..,xm∣y)p(y)=p(x1,x2,..,xm)p(y)∏i=1mp(xi∣y)在给定样本的情况下,P(x1,x2,...,xm)是常数,所以得到:p(y∣x1,x2,...,xm)∼p(y)i=1∏mp(xi∣y)从而:y^=argymaxP(y)i=1∏mp(xi∣y)
朴素贝叶斯算法流程
• 朴素贝叶斯算法流程/定义如下:
• 设x={x1 ,x2 ,…,xm}为待分类项,其中xi为x的一个特征属性
• 类别集合为C={y1 ,y2 ,…,yn }
• 分别计算P(y1 |x),P(y2 |x),…,P(yn |x)的值(贝叶斯公式)
• 如果P(yk |x)=max{P(y1 |x),P(y2 |x),…,P(yn |x)},那么认为x为yk类型
高斯朴素贝叶斯
Gaussian Naive Bayes是指当特征属性为连续值时,而且分布服从高斯分布,那么在计算P(x|y)的时候可以直接使用高斯分布的概率公式:
g
(
x
,
η
,
σ
)
=
1
2
π
σ
e
−
(
x
−
η
)
2
2
σ
2
p
(
x
i
∣
y
k
)
=
g
(
x
,
η
i
,
y
k
,
σ
i
,
y
k
)
g(x,\eta,\sigma)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\eta)^2}{2\sigma^2}}\\ p(x_i|y_k)=g(x,\eta_{i,y_k},\sigma_{i,y_k})
g(x,η,σ)=2πσ1e−2σ2(x−η)2p(xi∣yk)=g(x,ηi,yk,σi,yk)
因此只需要计算出各个类别中此特征项划分的各个均值和标准差
伯努利朴素贝叶斯
Bernoulli Naive Bayes是指当特征属性为连续值时,而且分布服从伯努利分布,那么在计算P(x|y)的时候可以直接使用伯努利分布的概率公式:
p
(
x
k
∣
y
)
=
p
(
1
∣
y
)
x
k
+
(
1
−
p
(
1
∣
y
)
(
1
−
x
k
)
p(x_k|y)=p(1|y)x_k+(1-p(1|y)(1-x_k)
p(xk∣y)=p(1∣y)xk+(1−p(1∣y)(1−xk)
伯努利分布是一种离散分布,只有两种可能的结果。1表示成功,出现的概率为p;0表示失败,出现的概率为q=1-p;其中均值为E(x)=p,方差为Var(X)=p(1- p)
多项式朴素贝叶斯
Multinomial Naive Bayes是指当特征属性服从多项分布(特征是离散的形式的时候),直接计算类别数目的占比作为先验概率和条件概率。
p
(
y
k
)
=
N
y
k
+
α
N
+
k
∗
α
p
(
x
i
∣
y
k
)
=
N
y
k
,
x
i
+
α
N
y
k
+
n
i
∗
α
p(y_k)=\frac{N_{y_k}+\alpha}{N+k*\alpha}\\ p(x_i|y_k)=\frac{N_{y_k,x_i}+\alpha}{N_{y_k}+n_i*\alpha}
p(yk)=N+k∗αNyk+αp(xi∣yk)=Nyk+ni∗αNyk,xi+α
N是总样本个数,k是总的类别个数,Nyk是类别为yk的样本个数,α为平滑值
Nyk是类别为yk的样本个数,ni为特征属性xi的不同取值数目,Nyk,xi为类别yk中第i维特征的值为xi的样本个数,α为平滑值。
当α=1时,称为Laplace平滑,当0<α<1时,称为Lidstone平滑,α=0时不做平滑;平滑的主要作用是可以克服条件概率为0的问题。
贝叶斯网络
把某个研究系统中涉及到的随机变量,根据是否条件独立绘制在一个有向图中,就形成了贝叶斯网络。
• 贝叶斯网络(Bayesian Network),又称有向无环图模型(directed acyclicgraphical model, DAG),是一种概率图模型,根据概率图的拓扑结构,考察一组随机变量{X1 ,X2 ,…,Xn}及其N组条件概率分布(Conditional ProbabililtyDistributions, CPD)的性质
当多个特征属性之间存在着某种相关关系的时候,使用朴素贝叶斯算法就没法解决这类问题,那么贝叶斯网络就是解决这类应用场景的一个非常好的算法。
一般而言,贝叶斯网络的有向无环图中的节点表示随机变量,可以是可观察到的变量,或隐变量,未知参数等等。连接两个节点之间的箭头代表两个随机变量之间的因果关系(也就是这两个随机变量之间非条件独立),如果两个节点间以一个单箭头连接在一起,表示其中一个节点是“因” ,另外一个是“果” ,从而两节点之间就会产生一个条件概率值。
• 贝叶斯网络的关键方法是图模型,构建一个图模型我们需要把具有因果联系的各个变量用箭头连在一起。贝叶斯网络的有向无环图中的节点表示随机变量。连接两个节点的箭头代表此两个随机变量是具有因果关系的。
• 贝叶斯网络是模拟人的认知思维推理模式的,用一组条件概率以及有向无环图对不确定性因果推理关系建模
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB
df = pd.read_csv('D:/save/datas/iris.data', header=None)
X = df.iloc[:, :-1]
Y = df.iloc[:, -1]
label = LabelEncoder()
Y = label.fit_transform(Y)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=10)
gass = GaussianNB()
bern = BernoulliNB()
multi = MultinomialNB()
model = np.array([gass, bern, multi])
train_score = []
test_score = []
for i in model:
i.fit(x_train, y_train)
train_score.append(i.score(x_train, y_train))
test_score.append(i.score(x_test, y_test))
print(train_score)
print(test_score)
from sklearn.datasets import fetch_20newsgroups_vectorized, fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.decomposition import TruncatedSVD
from sklearn.naive_bayes import GaussianNB
datas = fetch_20newsgroups(data_home='D:/save/datas/news',
subset='train',
remove=('headers', 'footers', 'quotes')
)
# print(data)
tfidf = TfidfVectorizer()
datas_tfidf = tfidf.fit_transform(datas.data)
# print(data_tfidf)
X = datas_tfidf
Y = datas.target
x_train, x_test, y_train, y_test = train_test_split(X, Y, random_state=22, test_size=0.2)
svd = TruncatedSVD(n_components=5000, random_state=28)
x_train = svd.fit_transform(x_train)
x_test = svd.transform(x_test)
guss = GaussianNB()
guss.fit(x_train, y_train)
y_trian_hat = guss.fit(x_train)
y_test_hat = guss.fit(x_test)
print(classification_report(y_train, y_train_hat))
print("------------------------")
print(classification_report(y_test, y_test_hat))