机器学习3:贝叶斯算法(Bayesian)

贝叶斯公式:

P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) P(B|A)=\frac{P(A|B)\ast P(B)}{P(A)} P(BA)=P(A)P(AB)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(hD)=P(h)P(Dh)/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(hD)=P(h)P(Dh)

    • 其中先验概率: P ( h ) P(h) P(h)表示单词 h h h在字典(语料库)中所有词的占比,也即词频;最大似然概率: P ( D ∣ h ) P(D|h) P(Dh)表示单词 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(Dh+)/P(D)
    P ( h − ∣ D ) = P ( h − ) ∗ P ( D ∣ h − ) / P ( D ) P(h-|D)=P(h-)*P(D|h-)/P(D) P(hD)=P(h)P(Dh)/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(Dh+)
    P ( h − ∣ D ) = P ( h − ) ∗ P ( D ∣ h − ) P(h-|D)=P(h-)*P(D|h-) P(hD)=P(h)P(Dh)
    • 其中先验概率: 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(Dh+)=P(d1,d2,...,dnh+) ,其表示所有垃圾邮件中出现和当前邮件一样的概率。
      P ( d 1 , d 2 , . . . , d n ∣ h + ) P(d1,d2,...,dn|h+) P(d1,d2,...,dnh+)可扩展为: 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(d1h+)P(d2d1,h+)P(d3d1,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(Dh+)=P(d1h+)P(d2h+)p(d3h+)...,其中 P ( d i ∣ h + ) P(di|h+) P(dih+)为单词 d i di di在所有垃圾邮件中的词频。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值