zoukankan      html  css  js  c++  java
  • 常见机器学习算法原理+实践系列6(朴素贝叶斯分类)

    朴素贝叶斯NB

    Native Bayes是一种简单有效的分类算法, 贝叶斯定律用这个条件概率公式来表示:

    P(A|B) = P(B|A)* P(A) / P(B),其中P(A|B)的意思是,在B发生的前提下,发生A的概率,P(A),P(B)代表现实中发生A以及B的概率,实际上取决于我们输入样本的情况。贝叶斯分类算法在邮件分类,文本分类等等很多场景有非常广泛的应用。比如在邮件分类中,可以这样简单的理解,假如一个邮件用这个词组合(w1,w2,….wn)来表示,那么这个邮件是垃圾邮件的概率是多少。实际上就是求P(垃圾邮件|w)的概率,而根据公式,P(垃圾邮件|w)=P(w|垃圾邮件)*P(垃圾邮件)/P(w),我们就能求出最终的概率,而以上公式的右边需要的三个概率都是可以在输入样本中通过训练得到的(有时候只是为了比较不同分类的概率值,所以不一定需要求出p(w),可以认为这个在输入样本不变的情况下,这个是不变的,不同分类不会影响这个值)。

    下面通过python的例子来演示下整个贝叶斯分类的过程:

    1.使用向量来表示一个邮件或者一个文本

             假设词汇表中有N个单词,我们可以使用1*N的向量来表示一个邮件内容,其中每个值代表某个词是否在邮件中出现,1代表出现,0代表没有出现。

             建立词汇表,使用一个set来表示:

    接着用一个向量来表示某个邮件,比如[0,1,0,0,1,1…..]

    2.训练阶段求出三个概率值

    3,利用训练阶段返回的概率值来分类

    贝叶斯假设每个特征(即每个词w1,w2…..)都是独立,就是说P(W|垃圾邮件)相当于:

    P(W1|垃圾邮件)*P(W2|垃圾邮件)*……;假设一个二分类问题,在发生W的情况下,求出P(垃圾邮件|W),以及P(正常邮件|W),那个值大,就认为是那个分类,而在实际应用中,为了保证准确度,规则是灵活变动的,比如已经是P>0.99才认为是准确的。

    那么我们的目标就是:

    P(垃圾邮件|W)> P(正常邮件|W) ? 是垃圾邮件 : 是正常邮件

    也就是比较以下两个值的大小:

    P(W|垃圾邮件)*P(垃圾邮件)/P(W)

    P(W|正常邮件)*P(正常邮件)/P(W)

             不考虑分母,然后分别取自然对数后,等价比较以下两个值大小:

             Ln(P(W|垃圾邮件)*P(垃圾邮件)) = Ln(P(W|垃圾邮件)) + Ln(垃圾邮件) = Ln (P(W1|垃圾邮件)) + … + Ln (P(Wn|垃圾邮件)) + Ln(垃圾邮件)

             Ln(P(W|正常邮件)*P(正常邮件)) = Ln(P(W|正常邮件)) + Ln(正常邮件)= Ln (P(W1|正常邮件)) + … + Ln (P(Wn|正常邮件)) + Ln(正常邮件)

    一些改进点:

    1. 上面的例子只是使用了有(1)或者无(0)来表示向量,而实际上这种会导致准确度有问题,可以使用出现的次数作为其中的词,甚至是该词的TD-IDF值。
    2. 上面的问题中我们是求解了P(C|W),也就是说存在某个词组合的情况是,该邮件是分类C的概率,在词出现比较多的时候,会来精确度的问题,可以把问题化解为联合概率,也就是单独求出每个词的概率P(C|Wi),然后取出其中概率最大的topN来求解,比如N=10,N=15等等,联合概率公式如下:  

          P=P1*P2*P3*….PN/( P1*P2*P3*….PN+(1-P1)*(1-P2)*(1-P3)…*(1-PN)),其中P1-PN就是我们挑选的TopN概率。

  • 相关阅读:
    【C++】《C++ Primer 》第二章
    【剑指Offer】链表的基本操作之创建、插入、删除
    【LeetCode】365.水壶问题
    【Flutter】事件处理与通知之原始指针事件处理
    【Flutter】功能型组件之对话框详解
    【Flutter】功能型组件之异步UI更新
    mongdb_基本操作
    startswith在项目中的应用
    subString在项目中的应用
    comtains在项目中的应用
  • 原文地址:https://www.cnblogs.com/crespohust/p/5927716.html
Copyright © 2011-2022 走看看