zoukankan      html  css  js  c++  java
  • 02-27 朴素贝叶斯


    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    朴素贝叶斯

    朴素贝叶斯是基于贝叶斯公式与特征条件独立假设的分类方法(注:贝叶斯公式是数学定义,朴素贝叶斯是机器学习算法)。朴素贝叶斯基于输入和输入的联合概率分布,对于给定的输入,利用贝叶斯公式求出后验概率最大的输出(y)。即可以总结为以下三点

    1. 已知类条件概率密度函数表达式和先验概率
    2. 利用贝叶斯公式转换成后验概率
    3. 根据后验概率大小进行决策分类

    一、朴素贝叶斯学习目标

    1. 朴素贝叶斯构造
    2. 朴素贝叶斯基本公式
    3. 朴素贝叶斯参数估计
    4. 多项式朴素贝叶斯、伯努利朴素贝叶斯、高斯朴素贝叶斯
    5. 朴素贝叶斯流程
    6. 朴素贝叶斯优缺点

    二、朴素贝叶斯引入

    假设现在有一个有两个类别的鸢尾花数据集,并且已经知晓每个数据的分类情况,并且假设数据的分布如下图所示。

    # 朴素贝叶斯引入图例
    from matplotlib.font_manager import FontProperties
    import matplotlib.pyplot as plt
    from sklearn import datasets
    %matplotlib inline
    
    font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
    
    iris_data = datasets.load_iris()
    X = iris_data.data[0:100, [0, 1]]
    y = iris_data.target[0:100]
    
    plt.scatter(X[0:50, [0]], X[0:50, [1]], color='r',
                s=50, marker='o', label='山鸢尾')
    plt.scatter(X[50:100, [0]], X[50:100, [1]],
                color='b', s=50, marker='x', label='杂色鸢尾')
    plt.xlabel('花瓣长度(cm)', fontproperties=font)
    plt.ylabel('花瓣宽度(cm)', fontproperties=font)
    plt.legend(prop=font)
    plt.show()
    

    png

    现在假设有一个未知分类的鸢尾花数据((x_1(花瓣长度),x_2(花瓣宽度))),用(p_1(x_1,x_2))表示样本属于山鸢尾(red)的概率,用(p_2(x_1,x_2))表示属于杂色鸢尾(blue)的概率,(p_1(x_1,x_2) + p_2(x_1,x_2) = 1)

    假设如果(p_1(x_1,x_2) > p_2(x_1,x_2))((x_1,x_2))为山鸢尾,否则为杂色鸢尾,即选择概率高的类别作为新样本的分类结果。这就是贝叶斯决策理论的核心思想,选择具有最高概率的决策。

    如果使用条件概率来表示这个上述所说的分类,则可以表示为

    [egin{align} & p(red|x_1,x_2) > p(blue|x_1,x_2) quad ext{样本属于山鸢尾} \ & p(red|x_1,x_2) < p(blue|x_1,x_2) quad ext{样本属于杂色鸢尾} end{align} ]

    即如果出现一个新样本,假设数据集有(n)个特征、(m)个分类,只需要计算这个样本的

    [arg\,max\,(p(red|x_1,x_2),p(blue|x_1,x_2)) ]

    如果只有两个特征(x_1)(x_2),那么计算并不会很难,按照条件公式计算即可,但是你有没有想过如果有(n)特征,(K)个分类呢?即计算

    [underbrace{arg\,max}_{c_k}\,p(c_j|x_1,x_2,ldots,x_n) quad(k=1,2,cdots,K) ]

    上述的计算量是非常大的,那么我们有没有一种简单的方法能够改善该公式呢?有是有一定有的,即朴素贝叶斯法。

    三、朴素贝叶斯详解

    3.1 朴素贝叶斯构造

    假设现有一个训练集有(K)个类别(c_1,c_2,ldots,c_k)(m)个样例,每个样例有(n)个特征,训练集可以表示为

    [((x_1^{(1)},x_2^{(1)},cdots,x_n^{(1)},y_1)(x_1^{(2)},x_2^{(2)},cdots,x_n^{(2)},y_2),cdots,(x_1^{(m)},x_2^{(m)},cdots,x_n^{(m)},y_m)) ]

    从样本中可以得到

    朴素贝叶斯的先验分布为(p(c_k) quad (k=1,2,ldots,K)),

    朴素贝叶斯的条件概率分布为(p(x_1,x_2,ldots,x_n|c_k)),

    利用条件概率公式得到(X)(Y)的联合分布(p(X,Y))

    [egin{align} p(X,Y) & = p((x_1,x_2,ldots,x_n),c_k) \ & = p(c_k)p(x_1,x_2,ldots,x_n|c_k) \ end{align} ]

    由于(p(x_1,x_2,ldots,x_n|c_k))是一个(n)个维度的条件分布,计算难度超级复杂,因此假设(X)(n)个维度之间相互独立(注:如果特征之间有大部分不是独立存在的,则应该尽量不要使用朴素贝叶斯模型,而应该考虑使用其他的分类方法),则可以把这个(n)维的条件分布改写成

    [p(x_1,x_2,ldots,x_n|c_k) = p(x_1|c_k)p(x_2|c_k)cdots{p(x_n|c_k)} ]

    虽然改写后的联合分布计算更加简单,但是由于假设所有的特征都是独立的,因此会相应的降低预测的不准确性。

    3.2 朴素贝叶斯基本公式

    假设已经得到了训练集的(p(c_k))(p(x_j|c_k))值,假设现有一个测试样本((x_{1},x_{2},ldots,x_{n})),则可以根据贝叶斯公式求得(K)个分类(c_1,c_2,ldots,c_k)各自的概率。

    [egin{align} p(c_k|x_{1},x_{2},ldots,x_{n}) & = {frac{p(x_{1},x_{2},ldots,x_{n}|c_k)p(c_k)}{p(x_{1},x_{2},ldots,x_{n})}} \ & = {frac{p(x_{1}|c_k)p(x_{2}|c_k)cdots{p(x_{n}|c_k)p(c_k)}} {p(x_{1},x_{2},ldots,x_{n})}} \ end{align} ]

    求得所有分类各自的概率之后,哪一个分类的概率最大,则样本属于哪一个分类。

    [egin{align} 样本类别 & = max\,(p(c_1|x_{1},x_{2},ldots,x_{n}),p(c_2|x_{1},x_{2},ldots,x_{n}),cdots,p(c_k|x_{1},x_{2},ldots,x_{n})) \ & = underbrace{arg\,max}_{c_k}\,{frac{p(x_{1}|c_k)p(x_{2}|c_k)cdots{p(x_{n}|c_k)}} {p(x_{1},x_{2},ldots,x_{n})}} \ end{align} ]

    其中(y = max\,f(x))表示(y)(f(x))中所有的值中最大的输出;(y = arg\,max f(x))表示(y)(f(x))中,输出的那个参数(t)

    由于每一个类别的概率公式的分子都是相同的,把分子去掉后则可以把上述公式转化为朴素贝叶斯模型的基本公式

    [egin{align} 样本类别 & = underbrace{arg\,max}_{c_k} {p(x_{1}|c_k)p(x_{2}|c_k)cdots{p(x_{n}|c_k)p(c_k)}} \ & = underbrace{arg\,max}_{c_k}\,p(c_k) prod_{j=1}^{n} p(x_{j}|c_k) end{align} ]

    3.3 朴素贝叶斯参数估计

    朴素贝叶斯模型的基本公式为

    [样本类别 = underbrace{arg\,max}_{c_k}\,p(c_k) prod_{j=1}^{n} p(x_{j}|c_k) ]

    其中(p(c_k))通过极大似然估计很容易算出样本类别(c_k)的出现频率,假设(c_k)出现(m_k)次,则

    [p(c_k) = {frac{m_k}{m}} ]

    而对于(p(x_j|c_k)),则需要考虑特征值的取值与分布情况。

    3.3.1 特征值为离散值

    假设(x_j)是离散值,则可以假设(x_j)符合多项式分布,这种情况下的(p(x_j|c_k))是样本类别(c_k)中特征(x_j)出现的频率,假设(x_j)(c_k)中出现的次数为(m_{k_j}),则

    [p(x_j|c_k) = {frac {m_{k_j}} {m_k} } ]

    由于假设所有特征相互独立,如果某个特征没有出现在某个类别中,则(p(x_j|c_k) = 0)会使分类产生偏差,一般采用贝叶斯估计解决该问题,即引入拉普拉斯平滑(Laplace smoothing),即

    [p(x_j|c_k) = {frac {m_{k_j} + lambda} {m_k + S_jlambda} } ]

    其中(lambdaleq0),当(lambda=0)时为最大似然估计;(lambda=1)时称为拉普拉斯平滑,(S_j)为第j个特征可以能取值的个数(注:由于(x_j)是离散的值,(x_j)有可能出现多次,并且每次出现的值可能不同)。

    3.3.2 特征值为稀疏的离散值

    假设(x_j)是非常稀疏的离散值,即各个特征出现的概率很低,这个时候可以假设(x_j)符合伯努利分布,即特征(x_j)出现为(1),不出现为(0)。则(p(x_j|c_k))(x_j)在样本类别(c_k)中出现的频率,则

    [p(x_j|c_k) = p(x_j|c_k)x_j + (1- p(x_j|c_k))(1-x_j) ]

    3.3.3 特征值为连续值

    假设(x_j)是连续值,则假设(x_j)符合高斯分布(正态分布),则可以把(x_j)直接带入正态分布公式,即可得

    [p(x_j|c_k) = {frac {1} {sqrt{2pisigma_k^2}} } exp (-{frac {(x_j - mu_{k})^2} {2sigma_k^2}}) ]

    其中(mu_k)是所有(x_j)的期望值,(sigma_k^2)是所有(x_j)的方差

    3.4 三种不同的朴素贝叶斯

    3.4.1 多项式朴素贝叶斯

    多项式朴素贝叶斯(Multinomial Naive Bayes)特征值符合多项式分布,多用于高维度向量分类,即样本特征为多元离散值,因此最常用于文章分类。

    from sklearn.naive_bayes import MultinomialNB
    

    3.4.2 伯努利朴素贝叶斯

    伯努利朴素贝叶斯(Bernoulli Naive Bayes)特征值符合伯努利分布,针对布尔类型特征值的向量做分类,即样本特征为二元离散值,或者为稀疏的多元离散值。

    from sklearn.naive_bayes import BernoulliNB
    

    3.4.3 高斯朴素贝叶斯

    高斯朴素贝叶斯(Gaussian Naive Bayes)特征符合高斯分布,多用于特征值为连续值,可以利用高斯概率密度公式进行分类拟合。

    from sklearn.naive_bayes import GaussianNB
    

    四、朴素贝叶斯流程

    4.1 输入

    (m)个实例(n)维特征的数据集

    [T={(x_1,y_1),(x_2,y_2),cdots,(x_m,y_m)} ]

    其中(x_i)是第(i)个实例的特征向量即(({x_i}^{(1)},{x_i}^{(2)},cdots,{x_i}^{(n)}))({x_i}^{(j)} quad(j=1,2,cdots,n))是第(i)个实例的第(j)个特征,({x_i}^{(j)}in{a_{j1},a_{j2},cdots,a_{jS_j}})(a_{jl} quad(l=1,2,cdots,S_j))是第(j)个特征可能的第(l)个值,(y_iin{c_1,c_2,cdots,c_K})(c_k quad (k=1,2,cdots,K))是第(k)个类;实例(x)

    4.2 输出

    实例(x)的类别。

    4.3 流程

    1. 计算先验概率和条件概率,即

    [egin{align} & p(Y=c_k) = {frac{sum_{i=1}^m I(y_i=c_k)}{m}} \ & p(X^{(j)} = a_{jl}| Y=c_k) = {frac{sum_{i=1}^m I({x_i}^{(j)}=a_{jl},y_i=c_k)}{sum_{i=1}^m I(y_i=c_k)}} end{align} ]

    1. 对于给定的实例(x=(x_{(1)},x_{(2)},cdots,x_{(n)})^T),计算

    [p(Y=c_k)prod_{j=1}^n p(X^{(j)} = x^{(j)}|Y=c_k) ]

    1. 确定实例(x)的类别

    [y = underbrace{arg\,max}_{c_k}\,p(Y=c_k) prod_{j=1}^n p(X^{(j)}=x^{(j)}|Y=c_k) ]

    五、朴素贝叶斯优缺点

    5.1 优点

    1. 朴素贝叶斯源自古典数学理论,其中用到了古典概率,有稳定的分类效果
    2. 对小规模数据表现很好,不需要使用(OvR)即可以处理多分类问题,并且可以把数据集拆分训练达到增量的目的
    3. 由于假设特征间相互独立,对缺失值不敏感,常用于文本分类

    5.2 缺点

    1. 由于假设特征间相互独立,也导致了分类的准确性会有误差(注:针对这一点可以调节关联不独立的特征,即半朴素贝叶斯算法)
    2. 由于后验概率的计算往往都假设先验概率已知,对数据的分布也有假设,有可能会因为假设的不确定性导致分类的准确性有误差

    六、小结

    朴素贝叶斯法是基于贝叶斯公式的一个理论,如果能记住贝叶斯公式并对概率论能提前有一个大概的了解,会更利于理解朴素贝叶斯法。

    朴素贝叶斯法在能够很好地解决多分类问题,但是由于它最大的缺点,即假设特征都是独立的,所以一般被用于文本分类,因为一般会认为单词与单词之间都是相互独立的。

    下一篇将会介绍一个在深度学习流行之前在工业上最常用的分类器,即支持向量机。

  • 相关阅读:
    成绩单问题
    详细介绍Linux shell脚本基础学习(一)
    千万级并发连接的秘密
    前段面试题
    cat 命令
    面试的一个网页设计师
    准备准备
    ls显示文件
    [HDU 1010 ]Tempter of the Bone
    Linux下的绘图(流程图、UML、mindmap)工具
  • 原文地址:https://www.cnblogs.com/nickchen121/p/11686774.html
Copyright © 2011-2022 走看看