机器学习:详解半朴素贝叶斯分类aode原理(附python实现)(代码片段)

Mr.Winter` Mr.Winter`     2022-10-23     462

关键词:

目录

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。

🚀详情:机器学习强基计划(附几十种经典模型源码合集)


1 独依赖假设

机器学习强基计划4-3:详解朴素贝叶斯分类原理 | 例题分析 | Python实现中我们介绍了朴素贝叶斯之所以“朴素”,是因为其给定了很强的属性独立性假设。然而,属性独立性假设在实际上很难成立,因此引入半朴素贝叶斯分类器(Semi-Naïve Bayes Classifier),其核心思想是:适当考虑部分属性的相互依赖,从而既简化了联合概率计算,又不至于彻底忽略属性间的强依赖关系

半朴素贝叶斯分类器最常见的建模策略是独依赖估计(One-Dependent Estimator, ODE),即假设每个属性在类别外最多依赖于一个属性

f ∗ ( x ) = a r g max ⁡ C ∈ Y P ( C ) ∏ i = 1 d P ( x i ∣ C , p a i ) f^*\\left( \\boldsymbolx \\right) =\\undersetC\\in \\mathcalY\\mathrmarg\\maxP\\left( C \\right) \\prod_i=1^dP\\left( x_i|C, pa_i \\right) f(x)=CYargmaxP(C)i=1dP(xiC,pai)

其中 p a i pa_i pai为属性 x i x_i xi所依赖的父属性。若对 ∀ x i \\forall x_i xi确定了其 p a i pa_i pai,则可按朴素贝叶斯的方式进行贝叶斯分类,因此问题的核心转换为如何确定 p a i pa_i pai

另一个问题是,可以假设属性依赖多个父属性吗?答案是:高阶依赖估计的准确性要求训练样本随指数级增加,在有限样本条件下,一般不适合采用。

2 AODE原理

先介绍一个比较直接的想法——假设所有属性都依赖于同一个父属性,称该属性为超父(super-parent),这种半朴素贝叶斯分类器称为SPODE(Super-Parent ODE)算法。

f ∗ ( x ) = a r g max ⁡ C ∈ Y P ( C ) ∏ i = 1 d P ( x i ∣ C , p a ) f^*\\left( \\boldsymbolx \\right) =\\undersetC\\in \\mathcalY\\mathrmarg\\maxP\\left( C \\right) \\prod_i=1^dP\\left( x_i|C, pa \\right) f(x)=CYargmaxP(C)i=1dP(xiC,pa)

建立在SPODE的基础上,AODE(Averaged ODE)算法是一种基于集成学习机制、更为强大的ODE分类器,其将每个属性作为超父构造SPODE,再加权计算各属性间的平均依赖,即

f ∗ ( x ) = a r g max ⁡ C ∈ Y ∑ i = 1 , ∣ D x i ∣ ⩾ m d P ( C , x i ) ∏ j = 1 d P ( x j ∣ C , x i ) f^*\\left( \\boldsymbolx \\right) =\\undersetC\\in \\mathcalY\\mathrmarg\\max\\sum_i=1,|\\boldsymbolD_x_i|\\geqslant m^dP\\left( C,x_i \\right) \\prod_j=1^dP\\left( x_j|C, x_i \\right) f(x)=CYargmaxi=1,DximdP(C,xi)j=1dP(xjC,xi)

其中 D x i \\boldsymbolD_x_i Dxi为第 i i i属性上取值为 x i x_i xi的样本子集, m m m默认设为30。类似地,AODE的拉普拉斯平滑修正为

P ( C , x i ) = ∣ D C , x i ∣ + 1 ∣ D ∣ + N × N i P ( x j ∣ C , x i ) = ∣ D C , x i , x j ∣ + 1 ∣ D C , x i ∣ + N j \\begincases P\\left( C,x_i \\right) =\\frac|\\boldsymbolD_C,x_i|+1|\\boldsymbolD|+N\\times N_i\\\\ P\\left( x_j|C,x_i \\right) =\\frac|\\boldsymbolD_C,x_i,x_j|+1|\\boldsymbolD_C,x_i|+N_j\\\\\\endcases P(C,xi)=D+N×NiDC,xi+1P(xjC,xi)=DC,xi+NjDC,xi,xj+1

简单说,AODE就是SPODE的加权平均版本

接下来基于上述原理开始编程,并和朴素贝叶斯分类做个比较,看性能有没提升

3 Python实现

3.1 计算类先验概率

'''
* @breif: 计算类先验概率P(C, xi)
* @param[in]: None
* @retval: None


    C1:  
            超父属性(只能是离散属性)
            pa1: 
                    超父属性值
                    px1: 
                            p: p(C1, x1)
                            N: n(C1, x1)
                        
                    ...
                    pxn: ...
                    num(pa1): int 属性a1的可取值数
                
            ...
            pan: ...
        
    ...
    Cn: ...
    num: 类别数


'''    
def calPrior(self):
    # 可选的类别数
    label = np.unique(self.y)
    self.prior['num'] = len(label)

    # 计算先验概率
    for _label in label:
        self.prior[_label] = 
        # 获取标签取值_label的样本集
        labelIndex = np.squeeze(np.argwhere(np.squeeze(self.y)==_label))
        labelX = self.X[:, labelIndex]           
        # 超父特征层
        for i in range(self.d):
            # 属性i的可选属性值列表
            attr = np.unique(self.X[i, :])
            # 可选属性数
            attrNum = len(attr)
            # 离散属性(只有离散属性能作为超父属性)
            if attrNum <= 0.85 * self.m:
                self.prior[_label][str(i)] = 
                self.prior[_label][str(i)]['num'] = attrNum
                # 计算每个取值的联合先验概率
                for a in attr:
                    self.prior[_label][str(i)][a] = 
                    n = int(sum(labelX[i, :] == a))
                    self.prior[_label][str(i)][a]['p'] = (n + self.laplace) / (self.m + self.prior['num'] * attrNum)
                    self.prior[_label][str(i)][a]['N'] = n

3.2 计算属性后验概率

'''
* @breif: 计算属性后验概率P(xj|C, xi)
* @param[in]: None
* @retval: None


    C1:  
            超父属性(只能是离散属性)
            pa1: 
                    超父属性值
                    px1: 
                            常规属性
                            a1: 
                                    type: discrete 离散属性
                                    x1: p(x1)
                                    ...
                                    xn: p(xn)
                                    num(a1): int 属性b1的可取值数
                                
                            a2: 
                                    type: continous 连续属性
                                    mean: 样本均值
                                    std: 标准差
                                
                        
                    ...
                    pxn: ...
                
            ...
            pan: ...
        
    ...
    Cn: ...
    num: 类别数


'''
def calPosterior(self):
    if not self.prior:
        raise ValueError("please calculate prior first!")
    # 

详解使用em算法的半监督学习方法应用于朴素贝叶斯文本分类

...是容易和廉价的。在下面的内容中,我们介绍使用半监督学习和EM算法,充分结合大量未标记的样本,以期获得文本分类更高的准确率。本文使用的是多项式朴素贝叶斯作为分类器,通过EM算法进行训练,使用有标记数据以及未... 查看详情

机器学习算法原理与编程实践之朴素贝叶斯分类

在介绍朴素贝叶斯分类之前,首先介绍一下大家都比较了解的贝叶斯定理,即已知某条件概率,如何得到两个时间交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)?可以通过如下公式求得:而朴素贝叶斯分类是一种简单... 查看详情

机器学习朴素贝叶斯分类器返回语句简介

】机器学习朴素贝叶斯分类器返回语句简介【英文标题】:Introtomachinelearningnaivebayesclassifierreturnstatement【发布时间】:2021-01-1302:15:40【问题描述】:我尝试从Udacity的机器学习入门课程中学习机器学习。第2课-朴素贝叶斯测验19:... 查看详情

常见机器学习算法原理+实践系列6(朴素贝叶斯分类)

朴素贝叶斯NBNativeBayes是一种简单有效的分类算法,贝叶斯定律用这个条件概率公式来表示:P(A|B)=P(B|A)*P(A)/P(B),其中P(A|B)的意思是,在B发生的前提下,发生A的概率,P(A),P(B)代表现实中发生A以及B的概率,实际上取决于我们输入... 查看详情

机器学习笔记——朴素贝叶斯

NaiveBayes朴素贝叶斯网络是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率论和统计知识进行分类。其原理是利用贝叶斯公式根据样本的先验概率来计算其后验概率(即样本属于某一类的概... 查看详情

机器学习实战3:基于朴素贝叶斯实现单词拼写修正器(附python代码)

...2.2语言模型建模2.3误差模型建模3单词修正测试0写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量... 查看详情

机器学习九大算法---朴素贝叶斯分类器

机器学习九大算法---朴素贝叶斯分类器 搞懂朴素贝叶斯分类算贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类... 查看详情

机器学习--贝叶斯分类算法及应用

1.朴素贝叶斯分类算法原理1.1概述贝叶斯分类算法是一大类分类算法的总称贝叶斯分类算法以样本可能属于某类的概率来作为分类依据朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种注:朴素的意思是条件概率独立性1.2算... 查看详情

机器学习——朴素贝叶斯算法

机器学习——朴素贝叶斯算法贝叶斯定理正向概率和逆向概率条件概率与全概率贝叶斯公式推导极大似然估计朴素贝叶斯分类器朴素可能性函数的作用拉普拉斯修正防溢出策略样例解释代码——使用拉普拉斯进行垃圾邮件分类构... 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第二章中文文本分类—朴素贝叶斯算法)

(上接第二章)  2.3分类算法:朴素贝叶斯  2.3.1贝叶斯公式推导(略)  分类的流程:    第一阶段:训练数据生成训练样本集:TF-IDF  第二阶段:对每个类别计算p(yi)。  第三个阶段:对每个特征属性计算... 查看详情

机器学习系列-朴素贝叶斯分类器

贝叶斯分类器什么是贝叶斯分类器贝叶斯分类器是一类分类器的总称,这些分类器均以贝叶斯定理为基础,故统称为贝叶斯分类器。这些分类器中最简单的是朴素贝叶斯分类器,它几乎完全按照贝叶斯定理进行分类,因此我们从... 查看详情

机器学习:基于朴素贝叶斯实现单词拼写修正器(附python代码)(代码片段)

...2.2语言模型建模2.3误差模型建模3单词修正测试0写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树... 查看详情

机器学习——朴素贝叶斯分类器

...络图书馆,我们能够给新进来的书贴上若干个标签,没有机器学习算法的情况下,我们须要给这些书手动分类。是计算机类的呀,还是非计算机类的呀。是小说类的呀。还是非小说类的云云。那么。我们能够通过让程序自己学习... 查看详情

通俗机器学习—朴素贝叶斯(代码片段)

引言机器学习分类中的k近邻法和决策树师确定的分类算法,数据实例最终会被明确划分到某个分类中,本节我们讨论的分类算法将不能完全确定数据实例应该划分到某个分类,或者智能给出数据实例属于给定分类的概率 一... 查看详情

机器学习朴素贝叶斯应用实例(代码片段)

朴素贝叶斯概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本章首先介绍贝叶斯分类算法的基础——贝叶斯定理。最后,我们通过实例来讨论贝叶斯分类的中最简单的一种:... 查看详情

机器学习:贝叶斯分类器——高斯朴素贝叶斯分类器代码实现(代码片段)

一高斯朴素贝叶斯分类器代码实现网上搜索不调用sklearn实现的朴素贝叶斯分类器基本很少,即使有也是结合文本分类的多项式或伯努利类型,因此自己写了一遍能直接封装的高斯类型NB分类器,当然与真正的源码相比少了很多属... 查看详情

机器学习——朴素贝叶斯分类器(代码片段)

贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。事件A在事件B(发生)的条件下的概率,与事件B在... 查看详情

机器学习系列——朴素贝叶斯分类器

贝叶斯定理:    其中: 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:。  查看详情