《机器学习数学基础》补充资料:贝叶斯分类器

在《机器学习数学基础》中,有专门讲解贝叶斯定理的章节,在此就不对此定理的具体内容进行阐述,下面仅列出定理的表达式:

贝叶斯定理

定理: 如果事件 A 1 , A 2 , ⋯ , A n A_1,A_2,\cdots,A_n A1,A2,,An 互不相容, B ⊂ ∪ j = 1 n A j B\subset\cup_{j=1}^nA_j Bj=1nAj ,则 P ( B ) > 0 P(B)\gt0 P(B)>0 时,有:

P ( A j ∣ B ) = P ( A j ) P ( B ∣ A j ) ∑ i = 1 n P ( A i ) P ( B ∣ A i ) (1) \displaystyle{P(A_j|B)=\frac{P(A_j)P(B|A_j)}{\sum_{i=1}^nP(A_i)P(B|A_i)}}\tag{1} P(AjB)=i=1nP(Ai)P(BAi)P(Aj)P(BAj)(1)

其中 1 ≤ j ≤ n 1\le j\le n 1jn

对于分类问题,假设有 K K K 种类别标签,即 Y = { c 1 , c 2 , ⋯ , c K } {\cal{Y}}=\{c_1,c_2,\cdots,c_K\} Y={c1,c2,,cK} (对应于(1)式中的互不相容的事件 A j A_j Aj )。对于样本 x \pmb{x} x ,要计算 P ( c j ∣ x ) P(c_j|\pmb{x}) P(cjx) ,根据(1)式,有:

P ( c j ∣ x ) = P ( c j ) P ( x ∣ c j ) P ( x ) (2) P(c_j|\pmb{x})=\frac{P(c_j)P(\pmb{x}|c_j)}{P(\pmb{x})}\tag{2} P(cjx)=P(x)P(cj)P(xcj)(2)

其中:

  • P ( c j ) P(c_j) P(cj) 是先验概率。当训练集中包含充足的独立同分布样本时,可以用各类样本出现的频率估计此概率。

  • P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj) 是样本 x \pmb{x} x 相对类别 c j c_j cj 的条件概率,称为“似然”。

    注意: 有的资料中认为 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj) 可以用频率来估计 [ 2 ] ^{[2]} [2] ,实则不然,参考资料 [3] 中对这个问题的完整说明。假设样本有 d d d 个特征,并且都是二值类型的数据,那么样本空间所有可能取值为 2 d 2^d 2d 个。在现实应用中,这个值往往远大于训练集的样本数。也就是,很多样本取值在训练集中根本没有出现。“未被观测到”与“出现概率为零”通常是不同的,所以,不能用频率来估计概率 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj)

    如果从概率的角度来看,得到的训练集样本都具有随机性,如果要能够用频率估计概率,必须满足样本与总体是同分布的。但是,在样本数不是很充足的时候,就不能满足。所以,对于似然,不能用频率来估计。

  • P ( x ) P(\pmb{x}) P(x) 与类别无关,对于一个训练集而言,它是一个常量。从(1)式中,分母对一个试验而言,是一个常量。所以,(2)式可以转化为:

    P ( c j ∣ x ) ∝ ⁣ P ( c j ) P ( x ∣ c j ) (3) P(c_j|\pmb{x})\propto\!P(c_j)P(\pmb{x}|c_j)\tag{3} P(cjx)P(cj)P(xcj)(3)

    由此可以,如果能够得到似然 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj) 的值,就可以根据(3)式得到后验概率 P ( c j ∣ x ) P(c_j|\pmb{x}) P(cjx) 的值,从而能够判断出样本所属的类别。

如何计算(3)式中的似然 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj) ,一种常用方法就是最大似然估计。

最大似然估计

在《机器学习数学基础》第6.2.1节,专门讲解了最大似然估计,这里使用其中的结论。

按照如下步骤计算 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj)

  1. 假设样本数据独立同分布,且为某种概率分布,但是不知道此概率分布的参数。
  2. 根据训练集样本数据,对概率分布的参数进行估计。假设 P ( x ∣ c j ) P(\pmb{x}|c_j) P(xcj) 的概率分布的参数向量是 θ \pmb{\theta} θ

根据参考资料 [1] 中的结论,可以得到如下似然:

L ( X c j ∣ θ ) = ∏ x ∈ X c j P ( x ∣ θ ) (4) L(\pmb{X}_{c_j}|\pmb{\theta})=\prod_{\pmb{x}\in\pmb{X}_{c_j}}P(\pmb{x}|\pmb{\theta})\tag{4} L(Xcjθ)=xXcjP(xθ)(4)

其中: X c j \pmb{X}_{c_j} Xcj 是数据集中类别为 c j c_j cj 的样本集合。

在具体计算的时候,可以对(4)式取对数。例如参考资料 [1] 的358页中给出了对于数据符合正态分布的参数 μ \mu μ σ 2 \sigma^2 σ2 (总体均值和方差)的估计。

设总体 X ∼ N ( μ , σ 2 ) X \sim N(\mu,\sigma^2) XN(μ,σ2) (正态分布), μ 、 σ 2 \mu、\sigma^2 μσ2 是未知参数, x 1 , ⋯ , x n x_1,\cdots,x_n x1,,xn 是来自 X X X 的样本值,求 μ 、 σ 2 \mu、\sigma^2 μσ2 的最大似然估计值。

  1. 写出 X X X 的概率密度函数: f ( x ; μ , σ 2 ) = 1 σ 2 π exp ⁡ ( − 1 2 σ 2 ( x − μ ) 2 ) f(x;\mu, \sigma^2) = \frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(x-\mu)^2\right) f(x;μ,σ2)=σ2π 1exp(2σ21(xμ)2)

  2. 写出似然函数(4)式:

    L = ∏ i = 1 n 1 σ 2 π exp ⁡ ( − 1 2 σ 2 ( x i − μ ) 2 ) = ( 2 π ) − n 2 ( σ 2 ) − n 2 exp ⁡ ( − 1 2 σ 2 ∑ i = 1 n ( x i − μ ) 2 ) L = \prod_{i=1}^n\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(x_i-\mu)^2\right)=(2\pi)^{-\frac{n}{2}}(\sigma^2)^{-\frac{n}{2}}\exp\left(-\frac{1}{2\sigma^2}\sum_{i=1}^n(x_i-\mu)^2\right) L=i=1nσ2π 1exp(2σ21(xiμ)2)=(2π)2n(σ2)2nexp(2σ21i=1n(xiμ)2)

  3. 对上式取对数

    log ⁡ L = − n 2 log ⁡ ( 2 π ) − n 2 log ⁡ σ 2 − 1 2 σ 2 ∑ i = 1 n ( x i − μ ) 2 \log L = -\frac{n}{2}\log(2\pi) - \frac{n}{2}\log\sigma^2-\frac{1}{2\sigma^2}\sum_{i=1}^n(x_i-\mu)^2 logL=2nlog(2π)2nlogσ22σ21i=1n(xiμ)2

  4. log ⁡ L \log L logL 分别对 μ \mu μ σ 2 \sigma^2 σ2 求偏导数,并令其为 0 0 0 (注意, σ 2 \sigma^2 σ2 视作一个整体)

    { ∂ ∂ μ log ⁡ L = 1 σ 2 ( ∑ i = 1 n x i − n μ ) = 0 ∂ ∂ σ 2 log ⁡ L = − n 2 σ 2 + 1 2 ( σ 2 ) 2 ∑ i = 1 n ( x i − μ ) 2 = 0 \begin{cases}\frac{\partial}{\partial \mu}\log L &= \frac{1}{\sigma^2}(\sum_{i=1}^nx_i - n\mu)=0 \\ \frac{\partial}{\partial\sigma^2}\log L &= -\frac{n}{2\sigma^2}+ \frac{1}{2(\sigma^2)^2}\sum_{i=1}^n(x_i-\mu)^2=0 \end{cases} {μlogLσ2logL=σ21(i=1nxinμ)=0=2σ2n+2(σ2)21i=1n(xiμ)2=0

  5. 解方程组,分别得到 μ \mu μ σ 2 \sigma^2 σ2 的极大似然估计

    μ ^ = 1 n ∑ i = 1 n x i = x ‾ σ ^ 2 = 1 n ∑ i = 1 n ( x i − x ‾ ) 2 ( 5 ) \begin{split}\hat\mu &= \frac{1}{n}\sum_{i=1}^nx_i=\overline x \\ \hat\sigma^2 &= \frac{1}{n}\sum_{i=1}^n(x_i-\overline x)^2\end{split}\quad(5) μ^σ^2=n1i=1nxi=x=n1i=1n(xix)2(5)

在《机器学习数学基础》中还以预测足球队比赛胜负概率为例,详细介绍了最大似然估计的应用。请参阅。

朴素贝叶斯分类器

如果进一步假设“特征相互独立”,即每个特征独立地对分类结果产生影响。

假设一个样本 x \pmb{x} x d d d 个特征,即: x = [ x 1 , x 2 , ⋯ , x d ] \pmb{x}=[x_1,x_2,\cdots,x_d] x=[x1,x2,,xd] ,则条件概率为:

P ( x ∣ c j ) = P ( x 1 , x 2 , ⋯ , x d ∣ c j ) = ∏ i = 1 d P ( x i ∣ c j ) , ( j = 1 , ⋯ , n ) ( 6 ) \begin{split} P(\pmb{x}|c_j)&=P(x_1,x_2,\cdots,x_d|c_j) \\&=\prod_{i=1}^dP(x_i|c_j),~(j=1,\cdots,n) \end{split}\quad(6) P(xcj)=P(x1,x2,,xdcj)=i=1dP(xicj), (j=1,,n)(6)

将(6)式代入到(2)式,则:

P ( c j ∣ x ) = P ( c j ) P ( x ∣ c j ) P ( x ) = P ( c j ) P ( x ) ∏ i = 1 d P ( x i ∣ c j ) (7) P(c_j|\pmb{x})=\frac{P(c_j)P(\pmb{x}|c_j)}{P(\pmb{x})}=\frac{P(c_j)}{P(\pmb{x})}\prod_{i=1}^dP(x_i|c_j)\tag{7} P(cjx)=P(x)P(cj)P(xcj)=P(x)P(cj)i=1dP(xicj)(7)

  • 对于(7)式中的先验概率 P ( c j ) P(c_j) P(cj) ,按照之前所讲,可以用该类别样本数量占全体数据集样本数量的比例来估计,即用频率估计概率,用下面的方式表示:

  • P ( c j ) = 1 K ∑ i = 1 K I ( y i = c j ) , ( j = 1 , 2 ⋯ , n ) (8) P(c_j)=\frac{1}{K}\sum_{i=1}^KI(y_i=c_j),~(j=1,2\cdots,n)\tag{8} P(cj)=K1i=1KI(yi=cj), (j=1,2,n)(8)

    其中 I ( ⋅ ) I(\cdot) I() 表示函数: I = { 1 , ( y = c ) 0 , ( o t h e r s ) \displaystyle{I=\begin{cases}&1,(y=c)\\&0,(others)\end{cases}} I={1,(y=c)0,(others)

  • 对于 ∏ i = 1 d P ( x i ∣ c j ) \prod_{i=1}^dP(x_i|c_j) i=1dP(xicj) ,则是利用(4)式的最大似然估计计算。针对不同的概率分布,分别有不同的计算结果。

高斯朴素贝叶斯分类器

即特征的条件概率分布满足高斯分布:

p ( x i ∣ c j ) = 1 2 π σ j 2 exp ( − ( x i − μ j ) 2 2 σ j 2 ) (9) p(x_i|c_j)=\frac{1}{\sqrt{2\pi\sigma^2_j}}\text{exp}\left(-\frac{(x_i-\mu_j)^2}{2\sigma^2_j}\right)\tag{9} p(xicj)=2πσj2 1exp(2σj2(xiμj)2)(9)

伯努利朴素贝叶斯分类器

即特征的条件概率分布满足伯努利分布:

P ( x i ∣ c j ) = p x i + ( 1 − p ) ( 1 − x i ) , ( 其中 : p = P ( x i = 1 ∣ c j ) , x i ∈ { 0 , 1 } ) (10) P(x_i|c_j)=px_i+(1-p)(1-x_i),~(其中:p=P(x_i=1|c_j),x_i\in\{0,1\})\tag{10} P(xicj)=pxi+(1p)(1xi), (其中:p=P(xi=1∣cj),xi{0,1})(10)

对(8)式和(9)式,利用最大似然估计,均可以估计到其中的参数,从而得到条件概率 P ( x i ∣ c j ) P(x_i|c_j) P(xicj) ,最大似然估计的方法见参考资料 [1] 。

最大后验估计 [ 1 ] ^{[1]} [1]

前面用最大似然估计,能够计算出条件概率,在利用(2)式,得到后验概率。这种方法,背后隐藏着一个基本观点,即认为分布的总体参数虽然未知,但是它是客观存在的一个固定值,因此可以通过优化似然函数获得。这就是所谓的频率主义学派的观点。

此外,还有另外一种观点,把参数也看成随机变量,它们也有一定的分布。于是就可以假定参数服从某种分布,即所谓先验分布。然后基于观测到的数据,计算参数的后验分布。并且获得的数据越多,后验分布可以得到不断的修正。持这种观点的人,也形成了一个学派,就是贝叶斯统计学。

贝叶斯学派强调“观察者”所掌握的知识(即对被观察对象的认识)。如果“观察者”知识完备,则能准确而唯一的判断事件的结果,不需要概率。

对于先验分布,假设为参数 θ 1 , ⋯ , θ k \theta_1,\cdots,\theta_k θ1,,θk ,在已有的认识中,这些参数具有某种规律,设概率密度函数为 g ( θ 1 , ⋯ , θ k ) g(\theta_1,\cdots,\theta_k) g(θ1,,θk) (简写为 g ( θ ) g(\pmb{\theta}) g(θ) 。此处以连续型分布为例,如果是离散型,可记作 p ( θ 1 , ⋯ , θ k ) p(\theta_1, \cdots, \theta_k) p(θ1,,θk) )。

先验分布 g ( θ 1 , ⋯ , θ k ) g(\theta_1,\cdots,\theta_k) g(θ1,,θk) 中的参数也是未知的(或部分未知)——这就是知识不完备。为了能准确判断,还需要结合观测数据得到的知识,也就是似然函数 f ( x 1 , ⋯ , x n ∣ θ 1 , ⋯ , θ k ) f(x_1,\cdots,x_n|\theta_1,\cdots,\theta_k) f(x1,,xnθ1,,θk) ,简写作 f ( x ∣ θ ) f(\pmb{x}|\pmb{\theta}) f(xθ)(如果是离散型,则可写作 p ( x 1 , ⋯ , x n ∣ θ 1 , ⋯ , θ k ) p(x_1,\cdots,x_n | \theta_1,\cdots,\theta_k) p(x1,,xnθ1,,θk) )。

然后将先验分布和似然函数,根据(1)式的贝叶斯定理,可得:

⁣ f ( θ ∣ x ) = f ( x ∣ θ ) g ( θ ) ∫ Θ f ( x ∣ θ ) g ( θ ) d θ (11) \displaystyle\!f(\pmb{\theta}|\pmb{x}) = \frac{f(\pmb{x}|\pmb{\theta})g(\pmb{\theta})}{\int_{\pmb{\Theta}}f(\pmb{x}|\boldsymbol{\theta})g(\pmb{\theta})d\pmb{\theta}} \tag{11} f(θx)=Θf(xθ)g(θ)dθf(xθ)g(θ)(11)

  • f ( θ ∣ x ) f(\pmb{\theta}|\pmb{x}) f(θx) 就是后验概率后验分布——“试验之后”。
  • Θ \pmb{\Theta} Θ g ( θ ) g(\pmb{\theta}) g(θ) 的值域,且 θ ∈ Θ \pmb\theta \in \pmb\Theta θΘ 。分母 ∫ Θ f ( x ∣ θ ) g ( θ ) d θ = p ( x ) \int_{\pmb\Theta}f(\pmb{x}|\pmb\theta)g(\pmb\theta)d\pmb\theta = p(\pmb{x}) Θf(xθ)g(θ)dθ=p(x) ,是观测到的数据的边缘分布,与 θ \pmb\theta θ 无关,在此相当于一个常数,故:

f ( θ ∣ x ) ∝ f ( x ∣ θ ) g ( θ ) (12) f(\pmb\theta|\pmb{x}) \propto f(\pmb{x}|\pmb\theta)g(\pmb\theta)\tag{12} f(θx)f(xθ)g(θ)(12)

在(10)式中,似然函数 f ( x ∣ θ ) f(\pmb{x}|\pmb\theta) f(xθ) 的函数形式可以根据观测数据确定(注意,参数 θ \pmb\theta θ 未知),

那么先验分布 g ( θ ) g(\pmb\theta) g(θ) 的形式应该如何确定?

在贝叶斯统计学中,如果先验分布 g ( θ ) g(\pmb\theta) g(θ) 和后验分布 f ( θ ∣ x ) f(\pmb\theta|\pmb{x}) f(θx) 为同种类型的分布,称它们为共轭分布(conjugate distributions),此时的先验分布称为似然函数 f ( x ∣ θ ) f(\pmb{x}|\pmb\theta) f(xθ)共轭先验(conjugate prior)。

显然,要对后验分布 f ( θ ∣ x ) f(\pmb\theta|\pmb{x}) f(θx) 求最大值。依据(12)式,进而计算 f ( x ∣ θ ) g ( θ ) f(\pmb{x}|\pmb\theta)g(\pmb\theta) f(xθ)g(θ) 的最大值,最终得到估计量 θ ^ \hat{\pmb\theta} θ^

a r g max ⁡ θ 1 , ⋯ , θ k f ( θ 1 , ⋯ , θ k ∣ x 1 , ⋯ , x n ) ∝ a r g max ⁡ θ 1 , ⋯ , θ k f ( x 1 , ⋯ , x n ∣ θ 1 , ⋯ , θ k ) g ( θ 1 , ⋯ , θ k ) (13) arg\max_{\theta_1,\cdots, \theta_k} f(\theta_1,\cdots,\theta_k|x_1,\cdots,x_n) \propto arg\max_{\theta_1,\cdots,\theta_k} f(x_1,\cdots,x_n|\theta_1,\cdots,\theta_k)g(\theta_1,\cdots,\theta_k)\tag{13} argθ1,,θkmaxf(θ1,,θkx1,,xn)argθ1,,θkmaxf(x1,,xnθ1,,θk)g(θ1,,θk)(13)

对上式右侧取对数:

a r g max ⁡ θ 1 , ⋯ , θ k log ⁡ ∏ i = 1 n f ( x i ∣ θ 1 , ⋯ , θ k ) + log ⁡ ( g ( θ 1 , ⋯ , θ k ) ) = a r g max ⁡ θ 1 , ⋯ , θ k ∑ i = 1 n ( log ⁡ f ( x i ∣ θ 1 , ⋯ , θ k ) ) + log ⁡ ( g ( θ 1 , ⋯ , θ k ) ) \begin{split}& arg\max_{\theta_1,\cdots,\theta_k} \log\prod_{i=1}^nf(x_i|\theta_1,\cdots,\theta_k)+\log(g(\theta_1,\cdots,\theta_k))\\ = & arg \max_{\theta_1,\cdots,\theta_k}\sum_{i=1}^n(\log f(x_i|\theta_1,\cdots,\theta_k)) + \log(g(\theta_1,\cdots,\theta_k))\end{split} =argθ1,,θkmaxlogi=1nf(xiθ1,,θk)+log(g(θ1,,θk))argθ1,,θkmaxi=1n(logf(xiθ1,,θk))+log(g(θ1,,θk))

这样,通过计算上式的最大值,就得到了参数的估计量 θ ^ M A P \hat{\pmb\theta}_{MAP} θ^MAP ,这个估计方法称为最大后验估计(maximum a posteriori estimation,MAP)。

不难看出, a r g max ⁡ θ 1 , ⋯ , θ k ∑ i = 1 n ( log ⁡ f ( x i ∣ θ 1 , ⋯ , θ k ) ) \displaystyle{arg\max_{\theta_1,\cdots,\theta_k}\sum_{i=1}^n(\log f(x_i|\theta_1,\cdots,\theta_k))} argθ1,,θkmaxi=1n(logf(xiθ1,,θk)) 就是最大似然的估计量 θ ^ M L E \hat{\pmb\theta}_{MLE} θ^MLE 。所以,我们可以说, log ⁡ g ( θ ) \log g(\pmb\theta) logg(θ) 就是对 θ ^ M L E \hat{\pmb\theta}_{MLE} θ^MLE 增加的正则项,此修正来自于我们的主观认识。注意一种特殊情况,如果先验分布式均匀分布,例如 g ( θ ) = 0.8 g(\theta) = 0.8 g(θ)=0.8 ,那么最大后验估计就退化为最大似然估计了。

下面使用参考资料 [1] 中已经证明的一个结论:

二项分布 p ( x ∣ θ ) = ( n x ) θ x ( 1 − θ ) n − x p(x|\theta)=\begin{pmatrix}n\\x\end{pmatrix}\theta^x(1-\theta)^{n-x} p(xθ)=(nx)θx(1θ)nx 的共轭服从 B \text{B} B 分布(Beta 分布),即:

g ( θ ) = p ( θ ) = B ( α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β ) θ α − 1 ( 1 − θ ) β − 1 (14) g(\theta)=p(\theta) = \text{B}(\alpha, \beta)= \frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\theta^{\alpha-1}(1-\theta)^{\beta-1}\tag{14} g(θ)=p(θ)=B(α,β)=Γ(α)Γ(β)Γ(α+β)θα1(1θ)β1(14)

其中 Γ ( ⋅ ) \Gamma(\cdot) Γ() 是 Gamma 函数( Γ ( n ) = ( n − 1 ) ! \Gamma(n) = (n-1)! Γ(n)=(n1)! ), α \alpha α β \beta β 是与样本无关的超参数。

并得到:

p ( θ ∣ x ) ∝ B ( x + α , n − x + β ) (15) p(\theta|x) \propto \text{B}(x+\alpha, n-x+\beta)\tag{15} p(θx)B(x+α,nx+β)(15)

即后验分布也是 B \text{B} B 分布,与先验分布构成了共轭分布。

并且可以求得:

θ ^ = x + α − 1 n + α + β − 2 (16) \hat{\theta} = \frac{x+\alpha-1}{n+\alpha+\beta-2}\tag{16} θ^=n+α+β2x+α1(16)

以上结论见参考资料 [1] 的6.2.3节。

如果,对于 θ \theta θ 的先验估计是 θ 0 \theta_0 θ0 ,可以令:

α = λ θ 0 + 1 β = λ ( 1 − θ 0 ) + 1 ( 17 ) \begin{split} \alpha&=\lambda\theta_0+1 \\\beta&=\lambda(1-\theta_0)+1 \end{split}\quad(17) αβ=λθ0+1=λ(1θ0)+1(17)

注意:(17)式是为了后面的目的而凑出来的一种假设,并引入了变量 λ \lambda λ

将(17)式代入(16)式,得到:

θ ^ = x + λ θ 0 n + λ (18) \hat{\theta}=\frac{x+\lambda\theta_0}{n+\lambda}\tag{18} θ^=n+λx+λθ0(18)

这就是所谓的拉普拉斯平滑,或曰拉普拉斯修正

多项朴素贝叶斯分类器

即特征的条件概率分布满足多项分布,其参数 θ \theta θ 的估计值就是经过拉普拉斯修正之后的值 [ 4 ] ^{[4]} [4]

θ ^ y i = N y i + α N y + α ⁣ n (19) \hat{\theta}_{y_i}=\frac{N_{y_i}+\alpha}{N_y+\alpha\!n}\tag{19} θ^yi=Ny+αnNyi+α(19)

其中 N y i = Σ x ∈ ⁣ T x i \displaystyle{N_{y_i}=\Sigma_{x\in~\!T}}x_i Nyi=Σx Txi 是测试集类别标签为 y y y 的样本中,特征 i i i 出现的次数。 N y = Σ i = 1 n N y i N_y=\Sigma_{i=1}^nN_{y_i} Ny=Σi=1nNyi 是所有类别标签是 y y y 的特征数量。

(21)式中的 α \alpha α ,称为平滑先验

  • α ≥ 0 \alpha\ge0 α0 ,考虑了学习样本中不存在的特征,并防止在进一步计算中出现零概率。
  • α = 1 \alpha=1 α=1 ,称为拉普拉斯平滑。
  • α < 0 \alpha\lt0 α<0 ,称为 Lidstone 平滑

朴素贝叶斯实现

使用 scikit-learn 提供的模块实现朴素贝叶斯分类器,网址见参考资料 [4] 。

常见的三种:高斯朴素贝叶斯,伯努利朴素贝叶斯和多项朴素贝叶斯。

高斯朴素贝叶斯

  1. 加载数据

    # 加载数据
    from sklearn import datasets
    wine = datasets.load_wine()
    
  2. 了解数据

    # 数据集特征(13个)
    wine.feature_names
    
    # 样本的类别标签(3个)
    wine.target_names
    
    # 数据集(特征)形状
    wine.data.shape
    
    # 查看前2条样本
    wine.data[:2]
    
    # 样本标签的值:
    wine.target
    
  3. 划分数据集

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target,test_size=0.3,random_state=20)
    
  4. 训练模型

    # 训练模型
    from sklearn.naive_bayes import GaussianNBgnb = GaussianNB()
    gnb.fit(X_train, y_train)
    
  5. 简单评估

    from sklearn import metrics# 预测
    y_pred = gnb.predict(X_test)
    metrics.accuracy_score(y_test, y_pred)
    

多项朴素贝叶斯

适合于离散特征,特别是文本分类。通常,要求特征下的数值是整数,但实际上,小数亦可以,例如 tf-idf 的数值。

案例:对新闻数据进行分类

  1. 引入模块并加载数据、划分数据集

    from sklearn.naive_bayes import MultinomialNB
    from sklearn.datasets import fetch_20newsgroups
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.model_selection import train_test_split# 获取数据
    news = fetch_20newsgroups(subset="all")# 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.2, random_state=20)
    
  2. 特征工程:从文本中计算 tf-idf

    transfer = TfidfVectorizer()
    X_train = transfer.fit_transform(X_train)
    X_test = transfer.transform(X_test)
    
  3. 训练模型

    mnb = MultinomialNB()  # 默认 alpha=1.0
    mnb.fit(X_train, y_train)
    
  4. 评估模型:拟合优度

    mnb.score(X_test, y_test)
    
  5. 观察 α \alpha α 对预测结果的影响

    # alpha的值对模型的影响
    import numpy as np
    alphas = np.logspace(-2, 5, num=200)  # 10^-2 到 10^5
    scores = []
    for alpha in alphas:mnb = MultinomialNB(alpha=alpha)mnb.fit(X_train, y_train)scores.append(mnb.score(X_test, y_test))
    
    # 绘图
    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)ax.plot(alphas, scores)ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel(r"score")
    ax.set_ylim(0, 1.0)
    ax.set_xscale('log')
    

伯努利朴素贝叶斯

适用于二分类问题。

案例:鉴别垃圾邮件

  1. 引入模块,加载数据

    import pandas as pd
    import numpy as np
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import BernoulliNBdata = pd.read_csv("./data/spam.csv", encoding='latin-1')
    data = data[['class', 'message']]
    
  2. 训练模型并评估

    # 特征 X,标签 y
    X = np.array(data["message"])
    y = np.array(data["class"])# 邮件内容向量化
    cv = CountVectorizer()
    X = cv.fit_transform(X)# 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)# 训练模型
    bnb = BernoulliNB(binarize=0.0)  # 参数说明 1
    bnb.fit(X_train, y_train)# 模型评估
    print(bnb.score(X_test, y_test))
    

    参数说明:

    • binarize
      • 如果为 None ,则假定原始数据已经二值化。
      • 如果是浮点数,则以该数值为临界,特征取值大于此浮点数的作为 1,小于的作为 0 。用这种方式将特征数据二值化。

参考资料

[1]. 齐伟. 机器学习数学基础[M]. 北京:电子工业出版社

[2]. 谈继勇. 深度学习500问[M]. 北京:电子工业出版社, 2021:73.

[3]. 周志华. 机器学习[M]. 北京:清华大学出版社, 2016:148-149

[4]. Naive Bayes[EB/OL]. https://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes . 2022.09.20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6171.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南

本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子&#xff1b;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…

KETTLE-SAP抽数报错RFC_ERROR_SYSTEM_FAILURE

KETTLE调SAP 合并ECCS相关的函数时报错 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Unexpected error 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-3…

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份&#xff0c;我已写下一篇《近一年多个人总结》&#xff0c;当时还没开始写博客。四月份写博后&#xff0c;就顺手将那篇总…

2024 行远自迩,笃行不怠

2024年是充满变化与挑战的一年&#xff0c;我的开发方向经历了从智能驾驶到工业智能检测&#xff0c;再到机器人感知交互与决策的不断演进。 这一年&#xff0c;我不断拓宽技术视野&#xff0c;深入探索不同领域的技术挑战和应用场景。 最初&#xff0c;我希望专注于单一领域…

【Linux】19.基础IO(1)

文章目录 1. 基础IO1. 文件2. 回顾C文件接口2.1 hello.c写文件2.2 hello.c读文件2.3 接口介绍 3. open函数返回值3.1 文件描述符fd3.2 文件描述符的分配规则3.2.1 代码13.2.2 代码23.2.3 重定向底层原理代码示例3.2.4 使用 dup2 系统调用 3.3 缓冲区刷新问题3.4 FILE 1. 基础IO…

客户案例:向导ERP与金蝶云星空集成方案

一、客户背景 该客户公司主要致力于黄金、铂金、金镶玉首饰的研发设计、生产加工、批发及直营加盟业务。公司总部占地面积目前已达6000多平方米&#xff0c;拥有标准生产厂房和现代化生产设施&#xff0c;拥有一支完善的企业管理团队和专业技工队伍。 该企业目前同时采用向导 E…

RabbitMQ 在实际应用时要注意的问题

1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…

Cesium特效——城市白模的科技动效的各种效果

最终效果图如下&#xff1a; 实现方法&#xff1a; 步骤一&#xff1a;使用cesiumlib生产白模&#xff0c;格式为3dtiles 注意事项&#xff1a;采用其他方式可能导致白模贴地&#xff0c;从而导致不能实现该效果&#xff0c;例如把步骤二的服务地址改为Cesium Sandcastle 里的…

4_高并发内存池项目_高并发池内存释放设计_ThreadCache/CentralCache/PageCache回收并释放内存

高并发池内存释放设计 对各缓存层释放内存的设计&#xff0c;不仅仅是从上一层回收内存&#xff0c;还包括对回收回来的内存怎样处理更有利于下一缓存层的回收&#xff0c;提高效率。 高并发内存池内存释放步骤&#xff1a; 线程对象释放内存 ↓↓↓↓↓ ThreadCache(1.回收线…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法

分子动力学模拟&#xff08;Molecular Dynamics Simulation&#xff0c;简称MD&#xff09;是一种基于经典力学原理的计算物理方法&#xff0c;用于模拟原子和分子在给定时间内的运动和相互作用‌。以下是关于分子动力学模拟的一些核心术语和概念&#xff1a; ‌定义系统‌&am…

iOS开发设计模式篇第二篇MVVM设计模式

目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…

【C++图论 并集查找】2492. 两个城市间路径的最小分数|1679

本文涉及知识点 C图论 并集查找&#xff08;并查集) LeetCode2492. 两个城市间路径的最小分数 给你一个正整数 n &#xff0c;表示总共有 n 个城市&#xff0c;城市从 1 到 n 编号。给你一个二维数组 roads &#xff0c;其中 roads[i] [ai, bi, distancei] 表示城市 ai 和 …

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…

⽤vector数组实现树的存储(孩⼦表示法)c++

在我们遇到的算法题中&#xff0c; ⼀般给出的树结构都是有编号的&#xff0c;这样会简化我们之后存储树的操作 &#xff0c;⼀般提供两个信息&#xff1b; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点&#xff0c;接下来8⾏&#xff…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价&#xff0c;可以直接输出excel&#xff0c;并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode&#xff1a; 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目&#xff0c;实现了…

基于微信小程序的童装商城的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

方便快捷的软件展示平台查找和下载所需的软件

## 软件展示平台项目概述 背景&#xff1a; 随着互联网的发展&#xff0c;软件的数量日益增长&#xff0c;用户需要一款方便快捷的软件展示平台来查找和下载所需的软件。本软件展示平台旨在为用户提供一个集中展示各类软件的平台&#xff0c;方便用户快速找到所需的软件并进行…