1 贝叶斯原理
p ( A ∣ B ) = p ( A ) × p ( B ∣ A ) p ( B ) p(A|B)=\frac{p(A)×p(B|A)}{p(B)} p(A∣B)=p(B)p(A)×p(B∣A)
提到贝叶斯大家都会想到这个计算条件概率的公式。的确,我当时做这些概率题时都是直接套公式,很少思考背后的原理。那么今天就来捋一捋吧。
首先,条件概率就是后验概率,后验概率是由先验概率和补充信息决定的。举个例子,当你看到一个有新生儿的家庭阳台上晾着粉色的小衣服,你会如何猜测这个新生儿的性别呢?
这里的先验概率就是0.5,补充信息是粉色的小衣服。当这个补充信息增强了原来的判断时,最终的概率就大于0.5,反之就小于0.5。显然,人们更喜欢给女孩买粉衣服,所以我们可以猜测新生儿是女孩。
那么从公式角度怎么理解呢?
我们把这个公式稍微变一下。
p
(
A
∣
B
)
=
P
(
A
)
×
p
(
B
∣
A
)
p
(
B
)
p(A|B)=P(A)×\frac{p(B|A)}{p(B)}
p(A∣B)=P(A)×p(B)p(B∣A)
假设
A
A
A代表新生儿是女孩,
B
B
B代表阳台上晾着的小衣服是粉色的。那么
p
(
A
∣
B
)
p(A|B)
p(A∣B)的含义就是在阳台晾粉衣服情况下新生儿是女孩的概率。
P
(
A
)
P(A)
P(A)是先验概率,为0.5。现在只要看
p
(
B
∣
A
)
p
(
B
)
\frac{p(B|A)}{p(B)}
p(B)p(B∣A)是否大于1就可以了。大于1就代表补充信息增强了原来的判断,反之则减弱。
怎么理解 p ( B ∣ A ) p ( B ) \frac{p(B|A)}{p(B)} p(B)p(B∣A)呢? p ( B ) p(B) p(B)的含义是一个普通家庭在阳台晾粉色小衣服的概率, p ( B ∣ A ) p(B|A) p(B∣A)代表当新生儿是女孩时阳台晾粉色小衣服的概率。那么当 p ( B ∣ A ) > p ( B ) p(B|A)>p(B) p(B∣A)>p(B)时,我们就可以知道人们更倾向于给女孩买粉衣服, p ( B ∣ A ) p ( B ) > 1 \frac{p(B|A)}{p(B)}>1 p(B)p(B∣A)>1,增强了原来的判断。
这就是贝叶斯公式的含义。
在实际情况中,我们一般是不需要考虑
p
(
B
)
p(B)
p(B)的。回到之前的公式:
p
(
A
∣
B
)
=
p
(
A
)
×
p
(
B
∣
A
)
p
(
B
)
p(A|B)=\frac{p(A)×p(B|A)}{p(B)}
p(A∣B)=p(B)p(A)×p(B∣A)
假设
A
‾
\overline{A}
A代表新生儿是男孩,那么相应的公式如下:
p
(
A
‾
∣
B
)
=
p
(
A
‾
)
×
p
(
B
∣
A
‾
)
p
(
B
)
p(\overline{A}|B)=\frac{p(\overline{A})×p(B|\overline{A})}{p(B)}
p(A∣B)=p(B)p(A)×p(B∣A)
比较这两个概率大小时,我们会发现只需要比较分子就可以了,分母是一样的。人们常说后验概率是由先验概率和似然概率决定的。体现在公式里,先验概率就是
p
(
A
)
p(A)
p(A),似然概率就是
p
(
B
∣
A
)
p(B|A)
p(B∣A)。
2 朴素贝叶斯
朴素贝叶斯是干嘛的呢?分类的,利用贝叶斯原理分类。假设
x
1
…
x
n
x_1…x_n
x1…xn代表一系列特征,
y
y
y代表类别,那么公式如下:
p
(
y
∣
x
1
…
x
n
)
=
p
(
y
)
×
p
(
x
1
…
x
n
∣
y
)
p
(
x
1
…
x
n
)
p(y|x_1…x_n)=\frac{p(y)×p(x_1…x_n|y)}{p(x_1…x_n)}
p(y∣x1…xn)=p(x1…xn)p(y)×p(x1…xn∣y)
现在我们做一个假设,假设这些特征都是相互独立的,那么公式就是:
p
(
y
∣
x
1
…
x
n
)
=
p
(
y
)
×
∏
i
=
1
n
p
(
x
i
∣
y
)
p
(
x
1
…
x
n
)
p(y|x_1…x_n)=\frac{p(y)×\prod_{i=1}^n{p(x_i|y)}}{p(x_1…x_n)}
p(y∣x1…xn)=p(x1…xn)p(y)×∏i=1np(xi∣y)
当给定输入时,分母是确定的,只看分子就行了。
p
(
y
)
p(y)
p(y)是先验概率,由数据分布决定,
p
(
x
i
∣
y
)
p(x_i|y)
p(xi∣y)可以直接算出来,有的可以通过极大似然估计得到。
上面这个假设非常简单而朴素(在现实生活中几乎不存在完全不相关的特征),所以叫朴素贝叶斯。
3 朴素贝叶斯实现文本分类
假如我们要用朴素贝叶斯判断一段评论文本是否包含侮辱词汇,该怎么做呢?
首先需要确定的是文本特征的表示方法,可以用每个词出现的频次表示。假如训练集文本和标签(1代表侮辱类,0代表非侮辱类)如下:
postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park','stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
labels = [0,1,0,1,0,1]
我们需要统计出所有句子中出现的词,得到一个词汇表。然后每个句子都可以根据句子单词在词汇表中出现频次表示成一维向量。
现在有了一个新的句子,[‘love’, ‘my’, ‘dalmation’]。我们来计算它属于侮辱类的概率。假如
c
1
c_1
c1表示侮辱类,
x
1
…
x
n
x_1…x_n
x1…xn为句子特征(就是上面的一维向量),则公式如下:
p
(
c
1
∣
x
1
…
x
n
)
=
p
(
c
1
)
×
∏
i
=
1
n
p
(
x
i
∣
c
1
)
p
(
x
1
…
x
n
)
p(c_1|x_1…x_n)=\frac{p(c_1)×\prod_{i=1}^n{p(x_i|c_1)}}{p(x_1…x_n)}
p(c1∣x1…xn)=p(x1…xn)p(c1)×∏i=1np(xi∣c1)
只看分子。
p
(
c
1
)
p(c_1)
p(c1)为先验概率,即侮辱类评论的比例,可以直接由标签得到,为
1
2
\frac{1}{2}
21。那么
p
(
x
i
∣
c
1
)
p(x_i|c_1)
p(xi∣c1)如何计算呢?可以先计算出侮辱类评论的词汇总数,再用
x
i
x_i
xi(句子中第i个单词的出现频次)除以训练集侮辱类词汇总数即可。由于每个概率值很小,若干个很小的概率值直接相乘,得到的结果会越来越小。为了避免计算过程出现下溢,可以对结果取对数。
计算完属于侮辱类的概率后,再用同样的方式计算属于非侮辱类的概率,比较大小即可得到结果。
详细计算过程可以看这篇:
https://www.cnblogs.com/hapjin/p/8119797.html.