zoukankan      html  css  js  c++  java
  • 朴素贝叶斯法

    朴素贝叶斯法可以用来做多分类问题。阅读本篇之前需要先去了解一下贝叶斯公式

    先验概率:事情还没有发生,根据以往的经验来判断事情发生的概率。是“由因求果”的体现,是单独事件概率,如 $P(X),P(Y)$。

    后验概率:事情已经发生了,有多种原因,判断事情的发生是由哪一种原因引起的。是“由果求因”,一般的形式为 $P(X|Y)$。

    先回顾一下统计学习方法的模型形式:

        1)决策模型:$Y = f(X)$,给一个输入 $X$,通过决策函数直接得到输出。

        2)条件概率分布:$P(Y|X)$,通过这个分布,给定一个输入 $X$,输出 $Y$ 不同,概率不同,选择概率最大时对应的那个输出 $Y$。

    以上两种都称为判别模型,还有一种生成模型,生成模型也是一种条件概率分布,但它是通过联合概率分布求得的。

    我们来比较一下这三种模型:

        1)$Y = f(X)$:这种模型不考虑 $X,Y$ 之间的随机性。

        2)$P(Y|X)$:只考虑 $Y$ 的随机性,即给定 $X$,得到 $Y$ 的一个分布。

        3)$P(Y|X) = frac{P(X,Y)}{P(X)}$:同时考虑了 $X$ 和 $Y$ 的随机性。

    朴素贝叶斯法正是一种生成模型,所以它并不是直接统计条件概率,而是先计算联合概率分布。

    朴素贝叶斯法基本概念

    输入:为随机向量 $x = (x^{(1)}, x^{(2)}, cdots , x^{(n)})^{T}$,设每个特征 $x^{j}$ 可能取值的集合为 $left { a_{j1},a_{j2},...,a_{jS_{j}} ight }$,$j=1,2,...,n$。

    输出:为随机变量(不是向量),$y in left { c_{1},c_{2}, cdots ,c_{K} ight }$

    条件独立:朴素贝叶斯对输入变量做了这么一个假设,即输入向量 $x$ 的各个特征之间条件独立,尽管这些特征相互依赖或者有些特征由其他特征决定。

    $$Pleft { X = x ;|; Y = c_{k} ight } = Pleft { X^{(1)} = x^{(1)}, X^{(2)} = x^{(2)}, cdots , X^{(n)} = x^{(n)} ;|; Y = c_{k} ight } \
    = Pleft { X^{(1)} = x^{(1)} ;|; Y = c_{k} ight } cdot Pleft { X^{(2)} = x^{(2)} ;|; Y = c_{k} ight } cdot ... cdot Pleft { X^{(n)} = x^{(n)} ;|; Y = c_{k} ight } \
    = prod_{j=1}^{n} Pleft { X^{(j)} = x^{(j)} ;|; Y = c_{k} ight }, ;;; k = 1,2,...,K$$

    假设训练数据集有 $m$ 组,即

    $$T = left {(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m}) ight }$$

    “朴素”的由来正是因为这个条件独立的假设。

    通过上面的定义,我们有 $m$ 个样本,每个样本有 $n$ 个特征,特征输出有 $K$ 个类别。

    朴素贝叶斯算法思想

    我们的目标是求 $P(Y|X)$,考虑条件概率

    $$P(Y|X) = frac{P(X,Y)}{P(X)} = frac{P(X|Y)P(Y)}{P(X)}$$

    朴素贝叶斯法通过训练集估计总体的联合概率分布 $P(X,Y)$,具体地,学习以下先验概率分布和条件概率分布:

    $$P(Y = c_{k}), ; k = 1,2,3,...,K$$

    $$Pleft { X = x ;|; Y = c_{k} ight } = Pleft { X^{(1)} = x^{(1)}, X^{(2)} = x^{(2)}, cdots , X^{(n)} = x^{(n)} ;|; Y = c_{k} ight }, ; i=1,2,...,m;k=1,2,...,K$$

    但这个计算方法事实上不切实际,已知 $x^{(j)}$ 的可能取值有 $S_{j}$ 个,$Y$ 的可能取值有 $K$ 个,则参数的不同组合方式有

    $$Kprod_{j=1}^{n}S_{j}$$

    在实际工程中,特征的数量非常大,也就是 $j$ 很大,假设是 $1000$,而特征的取值数量实际更多,因为很多连续的特征值一般转化为离散值来

    做,所以 $S$ 也很大(即使原始问题就是离散问题也不小),假设也是 $1000$ ,那么参数个数也达到了 $1000^{1001}$ 的数量级,更别说动辄大数据时

    代下百万特征的问题。

    为了降低计算的复杂度,朴素贝叶斯的假设便排上用场,因为各个特征之间条件独立,所以没必要一股脑的将所有特征联合起来。

    $$Pleft { X = x ;|; Y = c_{k} ight } = prod_{j=1}^{n}Pleft ( X^{(j)} = x^{(j)} ;|; Y = c_{k} ight ),; i=1,2,...,m; k=1,2,..,K$$

    于是数量级变成了 $1000^{3}$。最后得到的条件概率为

    $$Pleft ( Y = c_{k} ;|; X = x ight ) = frac{P(X = x, Y = c_{k})}{P(X = x)}
    = frac{Pleft ( X = x ;|; Y = c_{k} ight )Pleft ( Y = c_{k} ight )}{P(X = x)} \
    = frac{Pleft ( Y = c_{k} ight ) cdot prod_{j = 1}^{n}Pleft ( X^{(j)} = x^{(j)} ;|; Y = c_{k} ight )}{P(X = x)}, ; i=1,2,...,m; k=1,2,..,K$$

    每当输入一个特征向量 $x$(属于测试集),在寻找使 $P(Y|X)$ 最大的 $y$ 是,分母是不变的,所以只需要考虑使分子最大即可。

    $$y = arg ; max_{c_{k}} ; Pleft ( Y = c_{k} ight ) cdot prod_{j = 1}^{n}Pleft ( X^{(j)} = x_{}^{(j)} ;|; Y = c_{k} ight )$$

    朴素贝叶斯算法参数估计

    1)极大似然估计

       其实就是用样本估计总体,感觉这个名字不太贴切,可以这么想,如果用样本的计算结果作为总体的概率,那这组样本

       不就是最有可能出现的吗?

    $$P(Y = c_{k}) = frac{sum_{i=1}^{m}I(y_{i} = c_{k})}{m}, ; k = 1,2,3,...,K$$

       这就得到了 $K$ 个概率值。

    $$Pleft ( X^{left ( j ight )} = a_{jl} ;|; Y = c_{k} ight ) = frac{sum_{i=1}^{m}I(x_{i}^{(j)} = a_{jl},y_{i} = c_{k})}{sum_{i=1}^{m}I(y_{i} = c_{k})},j=1,2,...,n; l = 1,2,...,S_{j};k=1,2,..,K$$

       这就得到了 $Ksum_{j=1}^{n}S_{j}$ 个概率值,所以一共得到的概率值有

    $$Kleft ( sum_{j=1}^{n}S_{j} + 1 ight )$$

    2)贝叶斯估计

       但是有一个问题,训练集样本没办法覆盖所有的可能取值,这就可能导致预测的时候,所计算的先验概率为 $0$。

    $$P(Y = c_{k}) = frac{sum_{i=1}^{m}I(y_{i} = c_{k}) + lambda}{m + Klambda}, ; k = 1,2,3,...,K$$

    $$Pleft ( X^{left ( j ight )} = a_{jl} ;|; Y = c_{k} ight ) = frac{sum_{i=1}^{m}I(x_{i}^{(j)} = a_{jl},y_{i} = c_{k}) + lambda}{sum_{i=1}^{m}I(y_{i} = c_{k}) + S_{j}lambda},j=1,2,...,n; l = 1,2,...,S_{j};k=1,2,..,K$$

       分母多加的那一项是为了时概率和保持为 $1$,不然违背了概率理论。引入 $lambda$ 也称为拉普拉斯平滑。

  • 相关阅读:
    切片/修改
    代码块,-- 循环结构--字符串的格式化--字符串相关函数功能
    format 填充符号 与 格式化
    字符串的格式化format
    python字符串相关函数 *title *upper *lower *swapcase *len *count *find *index *starts with *endswith *isalpha *isdecimal *split *center *strip *replace
    双层循环经典小项目题
    while 小项目练习
    for循环 | range 对象
    关键字的使用 pass break continue
    python字符串的切片
  • 原文地址:https://www.cnblogs.com/yanghh/p/13664742.html
Copyright © 2011-2022 走看看