贝叶斯分类器学习笔记

我们知道,对于人类来说学习通常是指通过经验获得知识从而导致可度量的行为变化。也就是说我们通过经验获得了知识,然后这些知识又对我们未来的行为产生了影响。而机器学习则是让机器来进行学习,因此我们也可以认为机器学习同样是让机器通过经验(在计算机中表现为数据)获得知识(知识即为我们的模型),然后基于这些知识(模型)来对我们未来的行为产生影响(即不同的模型在接收到未来的新数据可能会得到不同的label)。对于人类来说最重要的是正确知识的获取,这对于机器来说也是一样的,最重要的是获得合适的模型。对于人类来说,知识是通过总结经验来得到的,那么对于机器来说,我们如何来总结已有的数据来得到模型是整个机器学习的核心问题。

在这里我们假设已有的数据为X,根据数据学习得到的模型产生的行为变化(lable)我们可以定义为Y,那么我们希望学习到的模型即可用一下公式来表达

model=P(Y|X)

,即我们拥有一个期望行为,我们希望我们通过学习得到的模型能够在有新数据来的时候得到我们想要的行为结果。

判别模型与生成模型

通过上面的描述我们知道机器学习的目标是得到一个模型使得其产生的行为(label)是我们所想看到的结果。那么我们如何来学习该模型呢?这里基于是否直接对P(Y|X)建模有两种策略:

  • 第一种是判别式模型,即直接对P(Y|X)来进行建模,例如线性回归模型,SVM,决策树等,这些模型都预先制定了模型的格式,所需要的就是通过最优化的方法学到最优参数Θ即可;
  • 第二种是生成式模型,这种策略并不直接对P(Y|X)进行建模,而是先对联合概率分布P(X,Y)进行建模,然后依据贝叶斯公式

    P(Y|X)=P(X,Y)P(X)

    间接的得到我们所期望的模型P(Y|X),这种策略最常见的算法就是我们接下来要介绍的贝叶斯分类器算法

贝叶斯分类器

通过上面对两种建模策略的描述我们知道贝叶斯分类器算法的建模策略是第二种,即生成式模型。那么我们如何来对联合分布P(x,y)来建模呢?我们依据贝叶斯公式知道P(x,y)=P(y)P(x|y),在这里我们称P(y)为标签y的先验概率,P(x|y)是样本x相对于标签y的条件概率(似然)。这样就把如何计算P(x,y)问题转换为了如何计算标签的先验概率P(y)和似然P(x|y)。

  • 先验分布P(y)估计方法:

    我们知道先验概率P(y)表示的是各个label在样本空间内所占的比例,依据大数定律可以知道当样本空间足够大,样本足够充足的时候,我们可以通过label对应样本出现的频率来对P(y)进行估计

  • 似然P(X|Y)估计方法:

    在这里我们通常有两种方法来进行估计:

    • 一种是类似于先验分布,我们通过统计频率的方式来计算似然P(x|y),但是这里要涉及到计算各个不同属性的联合概率,当属性值很多且样本量很大的时候,估计会很麻烦;
    • 第二种方式是使用极大似然法来进行估计。极大似然法是首先要假定条件概率P(x|y)服从某个分布,然后基于样本数据来对概率分布的参数进行估计。但是这种方法的准确性严重依赖于所假设的分布,如果假设的分布符合潜在的真实数据分布,则效果不错,否则效果会很糟糕。在现实应用中,这种假设通常需要一定的经验。

      对于极大似然,记标签y的条件概率为P(x|y),假设P(x|y)有确定的形式且被参数向量Θ唯一确定,那么我们的任务就是利用训练集来估计参数。我们可以将P(x|y)记为P(x|y;Θ)。因此对于参数Θ进行极大似然估计,就是在Θ的取值范围内寻找一组合适的参数使得P(x|y)最大,也就是找一组能够使得数据(x,y)出现的可能性最大的值。我们令Dy为训练集中标签为y的样本集合,假设样本都是独立同分布采样,那么参数Θ对于数据集Dy的对树似然为

      L(Θ;y)=logP(Dy|Θ;y)=∑x∈DylogP(x|Θ;y)

      那么参数Θ的极大似然估计θ^=argmaxL(Θ;y)

朴素贝叶斯分类器(Naive Bayesian — NB)

在上面对贝叶斯分类器的描述中,我们可以看到无论使用极大似然方法还是频率统计的方法,其类条件概率P(x|y)都是所有特征上的联合概率,这在有限的样本下是很难估计的。

朴素贝叶斯方法通过假设所有的特征都是独立的,这样我们就可以避免计算特征上的联合概率,从而将计算后验概率变为了:

P(y|x)=P(x,y)P(x)=P(y)P(x|y)P(x)=P(y)P(x)∏i=1dP(xi|y)

因为P(x)是确定的,因此朴素贝叶斯分类器的表达式就为

y=argmaxy∈YP(y)∏i=1dP(xi|y)

其中,先验概率P(y)和似然P(xi|y)都可以通过对样本频率进行统计来得到。在这里有一点需要注意,因为并不是所有的标签y都需要所有的特征x,因此有可能某些似然P(xi|y)=0,由于我们的分类器表达式是连乘格式,那么就会使得整体都为0。这明显不是我们所想要的,故这里我们引入了拉普拉斯平滑,通过拉普拉斯平滑来防止相乘为0这种尴尬的事情出现。

半朴素贝叶斯分类器

前面提到的朴素贝叶斯分类器,有一个很重要的前提就是我们需要假设所有属性之间是独立不相关的,这对于实际工程中来说是几乎不可能的。因此我们就像如果假设只有部分的特征之间是相关的,这样我们既考虑了属性之间的相关性又不需要计算所有特征的联合概率。半朴素贝叶斯就是基于这样的想法来设计的,在半朴素贝叶斯中,我们假设每个特征最多可以再依赖一个额外的特征,这种假设我们称之为”独依赖估计(ODE)“,即只依赖一个额外特征。

在这种假设下,我们的模型可以写成如下格式:

P(y|x)=P(y)P(x|y)P(x)=P(y)P(x)∏i=1dP(xi|xk,y)

其中,xk为属性xi所依赖的特征。因此我们可以看到在这种方法中最核心的问题是如何去确定每个特征所依赖的父特征是什么。确定父特征常用的方法有3中:

  • SPODE(Super-Parent ODE):

    这种方法就是所有的特征都依赖于同一个特征,这个特征我们称之为”超父(super parent)“,但是哪个特征该被选为超父呢,我们这里使用交叉验证的方式来确定,其结构如下图所示:

    在这里,每个特征都依赖于x1与y

  • TAN(Tree Augmented naive Bayes):

    这种方法的基础是最大带权生成树,即(1). 首先计算每两个特征之间的条件互信息;(2). 然后以特征为节点,以特征之间的条件互信息作为权值来构建一个完全图,根据该完全图再构建一个最大带权生成树,挑选根变量,将边置为有向;(3). 最后再加入y,增加从y到每个特征的有向边。其结构如下图所示:

    其中条件互信息的计算方法如下:

    I(xi,xj|y)=∑xi,xj;y∈YP(xi,xj|y)logP(xi,xj|y)P(xi|y)P(xj|y)

  • AODE(Average One-Dependent Estimator):

对于所有的半朴素贝叶斯分类器来说,其似然和先验都是基于频率统计的方法来计算的。

时间: 2024-10-25 10:03:00

贝叶斯分类器学习笔记的相关文章

朴素贝叶斯分类器学习

1.朴素贝叶斯概率模型的数学实质:独立条件概率. 朴素在这里的含义就是各影响因子概率发生独立. 2.朴素贝叶斯分类器的数学模型:条件概率模型 P(C|F1F2...Fn)=P(C)P(F1F2...Fn|C)/P(F1F2...Fn)                    (1) 这里Fn代表的是独立变量C的若干个特征变量(影响因子). 我们知道,对于数据的分类,Fn是已知的,对于P(F1F2...Fn)来说,他们只受到Fn的影响和独立变量C没有关系,所以对于(1)式,我们进行化简 P(C|F1

Web 在线文件管理器学习笔记与总结(5)

① 读出要修改的文件的内容 ② 进行修改 ③ 将修改后的内容写进文件 index.php: <?php require 'dir.func.php'; require 'file.func.php'; require 'common.func.php'; $path = 'file'; $info = readDirectory($path); $act = @$_REQUEST['act']; $filename = @$_REQUEST['filename']; //跳转变量 $redire

Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)

主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_executable() 判断文件是否可执行 filectime() 文件创建时间 filemtime() 文件修改时间 fileatime() 文件访问时间 file.func.php 封装文件操作的文件: <?php /* 转换字节大小 */ function transByte($size){ $ar

Web 在线文件管理器学习笔记与总结(13)重命名文件夹(14)复制文件夹

(13)重命名文件夹 ① 重命名文件夹通过 rename($oldname,$newname) 实现 ② 检测文件夹名是否符合规范 ③ 检测当前目录中是否存在同名文件夹名称,如果不存在则重命名成功 index.php: <?php require 'dir.func.php'; require 'file.func.php'; require 'common.func.php'; $path = 'file'; $path = @$_REQUEST['path'][email protected

Web 在线文件管理器学习笔记与总结(11)获取文件夹信息 (12)返回上一级操作

(11)获取文件夹信息 文件夹没有修改操作. index.php: <?php require 'dir.func.php'; require 'file.func.php'; require 'common.func.php'; $path = 'file'; $path = @$_REQUEST['path'][email protected]$_REQUEST['path']:$path; $info = readDirectory($path); if($info == NULL){ e

Web 在线文件管理器学习笔记与总结(4)查看文件内容

② 查看文件内容 a.通过 file_get_contents($filename) 得到文件内容 b.通过 highlight_string($string) 或者 highlight_file($filename) 显示内容.使用 PHP 内置的语法高亮器所定义的颜色,打印输出或者返回输出或者返回语法高亮版本的 PHP 代码 当使用 file_get_contents 读取(php)文件的内容并且显示在页面上,可以使用 <textarea></textarea> 包裹输出的内容

顶点着色器 学习笔记

顶点着色器 shader的三种变量类型 uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息:如果在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用:只读常量数据: attribute变量是只能在vertex shader中使用的变量:一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等: varying变量是vertex和fragment shader之间做数据传递用.一般vertex

Web 在线文件管理器学习笔记与总结(1)初始文件以及获取首层目录信息

在线文件管理器即使用浏览器管理和操作项目中的目录和文件 文件相关操作包括: 1.创建文件 2.判断文件的权限 3.文件的大小 4.文件的创建时间.修改时间.访问时间 5.查看文件的内容 6.修改文件的内容 7.删除文件 8.重命名文件 9.复制文件 10.剪切文件 11.上传文件 12.下载文件 文件夹相关操作: 1.新建文件夹 2.判断文件夹的权限 3.文件夹的大小 4.文件夹的创建时间.修改时间.访问时间 5.查看文件夹的内容 6.重命名文件夹 7.复制文件夹 8.剪切文件夹 9.文件夹的下

python装饰器学习笔记

什么是python装饰器? 装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. eg:当需要在Func1和Func2中加一样的功能时,可以在outer中添加一次就可以完成全部函数的添加.装饰器与函数建立连接的方式是在函数的前一行用@+装饰器名称来完成.并且在装饰器中一定要返回被装饰的对象 def outer(fun):     def wrapper():         print '验证'