贝叶斯公式:
P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) P(B|A)=\frac{P(A|B)\ast P(B)}{P(A)} P(B∣A)=P(A)P(A∣B)∗P(B)
1.拼写纠正实例:
问题:用户输入了一个不在字典中的单词(即错误的单词),需要去猜测其真正想输入的单词是什么?
方法:求解概率:P(猜测的单词 | 实际输入的单词),找到概率最大的猜测单词。
-
用户输入的单词记为D(D代表Data,即观测数据)
-
猜测1:p(h1|D),猜测2:p(h2|D)…
猜测概率统一写为:P(h|D)
则根据贝叶斯公式可得:
P ( h ∣ D ) = P ( h ) ∗ P ( D ∣ h ) / P ( D ) P(h|D)=P(h)*P(D|h)/P(D) P(h∣D)=P(h)∗P(D∣h)/P(D)
上述公式中,对于不同的具体猜测值 h 1 h1 h1, h 2 h2 h2…, P ( D ) P(D) P(D)都相同,则可忽略该值。
因此实际所需计算: P ( h ∣ D ) = P ( h ) ∗ P ( D ∣ h ) P(h|D)=P(h)*P(D|h) P(h∣D)=P(h)∗P(D∣h)- 其中先验概率: P ( h ) P(h) P(h)表示单词 h h h在字典(语料库)中所有词的占比,也即词频;最大似然概率: P ( D ∣ h ) P(D|h) P(D∣h)表示单词 D D D与单词 h h h的相似度,即把单词 h h h误写成单词 D D D的概率(可用编辑距离等方法计算)。
-
python代码实现:
import re
import collections
def words(text):
return re.findall('[a-z]+', text.lower())
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(open('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
n = len(word)
return set([word[0:i] + word[i+1:] for i in range(n)] +
[word[0:i] + word[i+1] + word[i] + word[i+2:] for i in range(n-1)] +
[word[0:i] + c + word[i+1:] for i in range(n) for c in alphabet] +
[word[0:i] + c + word[i:] for i in range(n+1) for c in alphabet])
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words):
return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=lambda w: NWORDS[w])
print(correct('learm'))
2.垃圾邮件过滤实例:
问题:给定一封邮件,判断它是否为垃圾邮件?
方法:此为一个二分类问题,可用贝叶斯算法解决,求解两种后验概率值并进行比较。
- 用D表示这封邮件,邮件中由N个单词组成;用h+表示垃圾邮件,h-表示正常邮件。
- 需要求解的两种后验概率值:
P ( h + ∣ D ) = P ( h + ) ∗ P ( D ∣ h + ) / P ( D ) P(h+|D)=P(h+)*P(D|h+)/P(D) P(h+∣D)=P(h+)∗P(D∣h+)/P(D)
P ( h − ∣ D ) = P ( h − ) ∗ P ( D ∣ h − ) / P ( D ) P(h-|D)=P(h-)*P(D|h-)/P(D) P(h−∣D)=P(h−)∗P(D∣h−)/P(D)
在实际计算中, P ( D ) P(D) P(D)可忽略掉,实际需要计算的概率为:
P ( h + ∣ D ) = P ( h + ) ∗ P ( D ∣ h + ) P(h+|D)=P(h+)*P(D|h+) P(h+∣D)=P(h+)∗P(D∣h+)
P ( h − ∣ D ) = P ( h − ) ∗ P ( D ∣ h − ) P(h-|D)=P(h-)*P(D|h-) P(h−∣D)=P(h−)∗P(D∣h−)- 其中先验概率: P ( h + ) P(h+) P(h+)和 P ( h − ) P(h-) P(h−)为邮件库中垃圾邮件和正常邮件的占比。
- D邮件中含有N个单词
d
1
,
d
2...
,
d1,d2...,
d1,d2...,则
P
(
D
∣
h
+
)
=
P
(
d
1
,
d
2
,
.
.
.
,
d
n
∣
h
+
)
P(D|h+)=P(d1,d2,...,dn|h+)
P(D∣h+)=P(d1,d2,...,dn∣h+) ,其表示所有垃圾邮件中出现和当前邮件一样的概率。
P ( d 1 , d 2 , . . . , d n ∣ h + ) P(d1,d2,...,dn|h+) P(d1,d2,...,dn∣h+)可扩展为: P ( d 1 ∣ h + ) ∗ P ( d 2 ∣ d 1 , h + ) ∗ P ( d 3 ∣ d 1 , d 2 , h + ) . . . P(d1|h+)*P(d2|d1,h+)*P(d3|d1,d2,h+)... P(d1∣h+)∗P(d2∣d1,h+)∗P(d3∣d1,d2,h+)...。
朴素贝叶斯假设特征之间是独立的,可将上式简化为:
P ( D ∣ h + ) = P ( d 1 ∣ h + ) ∗ P ( d 2 ∣ h + ) ∗ p ( d 3 ∣ h + ) ∗ . . . P(D|h+)=P(d1|h+)*P(d2|h+)*p(d3|h+)*... P(D∣h+)=P(d1∣h+)∗P(d2∣h+)∗p(d3∣h+)∗...,其中 P ( d i ∣ h + ) P(di|h+) P(di∣h+)为单词 d i di di在所有垃圾邮件中的词频。