zoukankan      html  css  js  c++  java
  • [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

    [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)


    ## 贝叶斯公式

    [P(Amid B) = frac{P(Bmid A)P(A)}{P(B)} ]

    我们把P(A)称为"先验概率"(Prior probability),即在B事件发生之前,对A事件概率的一个判断。P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,对A事件概率的重新评估。P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

    所以,条件概率可以理解成式子:后验概率 = 先验概率 x 调整因子。这就是贝叶斯推断的含义。先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

    而分类问题的目标是,根据给定特征得出类别。代入到贝叶斯公式中就是:

    [P(类别mid 特征) = frac{P(特征mid 类别)P(类别)}{P(特征)} ]


    ##拼写纠正实例

    需求:当用户输入一个不在字典中的单词,推测他想输入的单词

    猜测用户想输入的单词为h,而实际输入的单词D,根据公式有:

    [P(hmid D) = frac{P(h)P(Dmid h)}{P(D)} ]

    对于不同的猜测词h1、h2、h3...,P(h)为词频,P(D|h)可用不同字母的个数 / 键盘上的字母键位距离等评估,P(D)为一常数,在比较时可忽略。

    于是有 (P(hmid D) propto{P(h)P(Dmid h)}) ,比较多种猜测中哪个概率最大则可以判断纠正为这个正确的单词。


    ### 模型比较理论
    • 最大似然:最符合观测数据的(即P(D|h)最大的)最有优势
    • 奥卡姆剃刀:P(h)较大的模型有较大的优势(越常见的最好 如在拟合曲线中不会使用高阶函数去拟合因为出现概率少)

    ### 代码
    import re, collections
    
    def words(text):
        return re.findall('[a-z]+', text.lower()) #findall(pattern, string, flags=0) 返回string中所有与pattern相匹配的全部子串
    
    def train(features):
        model = collections.defaultdict(lambda: 1) #py2.7中的常用集合模块collections
        for f in features:
            model[f] += 1
        return model
    
    NWORDS = train(words(open('big.txt').read()))
    
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    
    #两个词之间的编辑距离定义为 使用了几次插入、删除、交换、替换
    
    def edits1(word):   #编辑距离为1
        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)] +   #交换
                   [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) for c in alphabet]    #插入
                    )
    
    def edits2(word):    #编辑距离为2
        return set(e2 for e1 in edits1(word) for e2 in edits1(e1))
    
    #只返回正确的单词
    def known(words):
        return set(w for w in words if w in NWORDS)
    
    #如果known(set)非空 则不再计算后面的
    def correct(word):
        candidates = known([word]) or known(edits1(word)) or known(edits2(word)) or [word]
        return max(candidates, key=lambda w: NWORDS[w]) #返回概率最大的值
    
    # argmaxc P(c|w) -> argmaxc P(w|c)P(c)/P(w)
    # P(c) c的词频 P(w|c) 在想键入c的情况下敲成w的概率
    

    ## 垃圾邮件过滤实例

    这是一个典型的二分类问题。设邮件内容为D,h+表示垃圾邮件 h-表示正常邮件。

    于是有

    P(h+|D) = P(h+)P(D|h+)/P(D)
    P(h-|D) = P(h-)P(D|h-)/P(D)

    假设D里面含有N个单词d1,d2,d3...,

    P(D|h+) = P(d1,d2,...,dn|h+) = P(d1|h+) * P(d2|d1,h+) * P(d3|d2,d1,h+) * ...

    由于朴素贝叶斯分类器基于一个简单的假定:给定目标值时属性之间相互条件独立,于是可化为 P(d1|h+) * P(d2|h+) * P(d3|h+) * ... 也即统计词频

  • 相关阅读:
    响应式的WEB设计
    WPF的抽奖程序
    使用Visual Studio 利用WinGDB编译和远程调试嵌入式Linux的程序
    Sqler 工具帮你解决(更新部分监控)
    YSlow相关规则的调优工具和方法
    wcf基础笔记
    HTTP协议之状态码详解
    网站首页图片滚动显示
    CodeLove初版发布
    HDFS学习– Namenode and Datanode
  • 原文地址:https://www.cnblogs.com/thousfeet/p/9831185.html
Copyright © 2011-2022 走看看