zoukankan      html  css  js  c++  java
  • 机器学习学习笔记之三:朴素贝叶斯

    条件概率和贝叶斯公式

    条件概率

    (p(x|y)) 表示在 (y) 发生的条件下 (x) 发生的概率。

    条件概率公式:
    已知 (p(x))(p(y)),以及(x), (y)同时发生的概率(p(xy)),那么

    [p(x|y) = frac{p(xy)}{p(y)} ]

    [p(y|x) = frac{p(xy)}{p(x)} ]

    贝叶斯公式

    由以上两个公式我们还可以得到

    [p(x|y) = frac{p(y|x)p(x)}{p(y)} ]

    这就是贝叶斯公式。其中,
    (p(x)) 称为 (x)先验概率
    (p(y)) 称为 (y)先验概率
    (p(y|x)) 称为 (y)(x) 发生后的后验概率
    (p(x|y)) 称为 (x)(y) 发生后的后验概率

    我们把其中的(x, y)替换成“特征”,“类别”,于是就有更容易理解的公式:

    [p(类别|特征) = frac{p(特征|类别)p(类别)}{p(特征)} ]

    使用朴素贝叶斯算法对数据进行分类

    基本原则:

    假设我们有两种类别(c_1, c_2),如何对特征(vec{w})进行分类?只要计算(p(c_1|vec{w}))(p(c_2|vec{w})),然后判断哪个概率更大。
    ( ext{if} p(c_1|vec{w}) > p(c_1|vec{w}) ext{then} vec{w} in c_1)
    ( ext{if} p(c_1|vec{w}) < p(c_1|vec{w}) ext{then} vec{w} in c_2)

    例1:简单的数据分类

    已知某女择偶标准可分为[帅,富,高,上进]四个特征。其中根据四个特征分别取值1和0,根据该女过去的相亲记录,有如下分布:

    上进
    00000
    00010
    00100
    00111
    01011
    01101
    01111
    10000
    10010
    11101

    现在有一男,特征分别是[帅,不富,高,不上进],请问是否符合该女的择偶标准?

    :根据贝叶斯公式,我们要求的量是 (p(嫁|[帅,不富,高,不上进]))(p(不嫁 | [帅,不富,高,不上进]))
    我们先计算比较容易计算的量:(p([帅,不富,高,不上进])),由于朴素贝叶斯的条件,我们认为这四个特征是彼此独立的。因此

    [egin{align*} p([帅,不富,高,不上进]) & = p(帅)p(不富)p(高)p(不上进) \ & = 0.3 imes 0.6 imes 0.5 imes 0.5 \ & = 0.045 end{align*}]

    另外我们还可以求得

    [p(嫁) = 0.5, p(不嫁) = 0.5 ]

    由于各特征彼此独立,所以

    [egin{align*}p([帅,不富,高,不上进] | 嫁) &= p(帅|嫁)p(不富|嫁)p(高|嫁)p(不上进|嫁) \ & = frac{p(帅,嫁)}{p(嫁)} imes frac{p(不富,嫁)}{p(嫁)} imes frac{p(高,嫁)}{p(嫁)} imes frac{p(不上进,嫁)}{p(嫁)} \ & = frac{0.1}{0.5} imes frac{0.1}{0.5} imes frac{0.4}{0.5} imes frac{0.2}{0.5} \ & = 0.0128 end{align*}]

    [egin{align*}p([帅,不富,高,不上进] | 不嫁) &= p(帅|不嫁)p(不富|不嫁)p(高|不嫁)p(不上进|不嫁) \ & = frac{p(帅,不嫁)}{p(不嫁)} imes frac{p(不富,不嫁)}{p(不嫁)} imes frac{p(高,不嫁)}{p(不嫁)} imes frac{p(不上进,不嫁)}{p(不嫁)} \ & = frac{0.2}{0.5} imes frac{0.5}{0.5} imes frac{0.1}{0.5} imes frac{0.3}{0.5} \ & = 0.048 end{align*}]

    所以

    [egin{align*} p(嫁|[帅,不富,高,不上进]) &= frac{p([帅,不富,高,不上进] | 嫁)p(嫁)}{p([帅,不富,高,不上进])} \ &=frac{0.0128 imes 0.5}{0.045} \ &=0.142 end{align*}]

    [egin{align*} p(不嫁 | [帅,不富,高,不上进]) &= frac{p([帅,不富,高,不上进] | 不嫁)p(不嫁)}{p([帅,不富,高,不上进])} \ &= frac{0.048 imes 0.5}{0.045} \ &= 0.533 end{align*}]

    显然 (p(不嫁 | [帅,不富,高,不上进]) > p(嫁|[帅,不富,高,不上进])),所以该男不符合该女的择偶标准。

    但是,这个例子仅仅是通过现有的数据和贝叶斯公式直接得出结论,缺少训练的步骤。下面这个例子会通过对垃圾邮件进行分类来详细说明训练和测试的步骤。

    例二:垃圾邮件分类

    本质上,垃圾邮件分类可以用贝叶斯公式表示如下:

    [p(是垃圾邮件|词向量vec{w_i}) = frac{p(vec{w_i}|是垃圾邮件)p(是垃圾邮件)}{p(vec{w_i})} ]

    因此,我们要计算的就是等式右边的三个概率。

    1. 文本人工标注,确定 (p(是垃圾邮件))(p(不是垃圾邮件))
    2. 对文本进行划分,求 (p(vec{w_i}))
      (p(vec{w_i})) 的本质是,在(vec{w_i})中出现的所有词占全部词的比例。
      假定所有单词出现的概率是彼此独立的,那么

    [p(vec{w_i}) = p(w_0)p(w_1)p(w_2)...p(w_n), w0,w1,...w_n in vec{w_i} ]

    因此

    [p(vec{w_i}) = prod_{k=1}^N frac{在文本t_i中w_k出现的次数}{w_k出现的总次数} ]

    1. 计算(p(vec{w_i} | 是垃圾邮件))
      同样地,由于各单词出现的概率彼此独立,因此

    [egin{align*} p(vec{w_i} | 是垃圾邮件) & = prod_{i=1}^N frac{p(vec{w_i}, 是垃圾邮件)}{p(是垃圾邮件)} end{align*}]

    使用对数可以消除乘除法带来的误差,所以上述公式又可表示成

    [egin{align*} ln p(是垃圾邮件|vec{w_i}) & = ln p(vec{w_i} | 是垃圾邮件) + ln p(是垃圾邮件) - ln p(vec{w_i})\ end{align*}]

  • 相关阅读:
    JVM系列文章(三):Class文件内容解析
    android开发 不注意的异常
    【数据结构】二叉树
    Android解析中国天气网的Json数据
    最简单也最难——怎样获取到Android控件的高度
    Android通过HTTP POST带參訪问asp.net网页
    js 推断 当页面无法回退时(history.go(-1)),关闭网页
    SQL Server数据库存储过程的异常处理
    SQL Server代码如何快速格式化,sqlserver代码
    sql server 获取指定格式的当前日期
  • 原文地址:https://www.cnblogs.com/ryuasuka/p/7405142.html
Copyright © 2011-2022 走看看