贝叶斯分类
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法,希望有利于他人理解。
1 分类问题综述
对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作。
从数学角度来说,分类问题可做如下定义:已知集合和,确定映射规则y = f(x),使得任意有且仅有一个,使得成立。
其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。
分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别,也是我们下面要讲的,每一个不同的分类算法,对应着不同的核心思想。
本篇文章,我会用一个具体实例,对朴素贝叶斯算法几乎所有的重要知识点进行讲解。
2 朴素贝叶斯分类
那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?
是下面这个贝叶斯公式:
换个表达形式就会明朗很多,如下:
我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。
3 例题分析
下面我先给出例子问题。
给定数据如下:
现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?
这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!
这里我们联系到朴素贝叶斯公式:
我们需要求p(嫁|(不帅、性格不好、身高矮、不上进),这是我们不知道的,但是通过朴素贝叶斯公式可以转化为好求的三个量.
p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)(至于为什么能求,后面会讲,那么就太好了,将待求的量转化为其它可求的值,这就相当于解决了我们的问题!)
4 朴素贝叶斯算法的朴素一词解释
那么这三个量是如何求得?
是根据已知训练数据统计得来,下面详细给出该例子的求解过程。
回忆一下我们要求的公式如下:
那么我只要求得p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)即可,好的,下面我分别求出这几个概率,最后一比,就得到最终结果。
p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁),那么我就要分别统计后面几个概率,也就得到了左边的概率!
等等,为什么这个成立呢?学过概率论的同学可能有感觉了,这个等式成立的条件需要特征之间相互独立吧!
对的!这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!
1、我们这么想,假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。
36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。
2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁),
我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。
根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
好的,上面我解释了为什么可以拆成分开连乘形式。那么下面我们就开始求解!
我们将上面公式整理一下如下:
下面我将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。
p(嫁)=?
首先我们整理训练数据中,嫁的样本数如下:
则 p(嫁) = 6/12(总样本数) = 1/2
p(不帅|嫁)=?统计满足样本数如下:
则p(不帅|嫁) = 3/6 = 1/2 在嫁的条件下,看不帅有多少
p(性格不好|嫁)= ?统计满足样本数如下:
则p(性格不好|嫁)= 1/6
p(矮|嫁) = ?统计满足样本数如下:
则p(矮|嫁) = 1/6
p(不上进|嫁) = ?统计满足样本数如下:
则p(不上进|嫁) = 1/6
下面开始求分母,p(不帅),p(性格不好),p(矮),p(不上进)
统计样本如下:
不帅统计如上红色所示,占4个,那么p(不帅) = 4/12 = 1/3
性格不好统计如上红色所示,占4个,那么p(性格不好) = 4/12 = 1/3
身高矮统计如上红色所示,占7个,那么p(身高矮) = 7/12
不上进统计如上红色所示,占4个,那么p(不上进) = 4/12 = 1/3
到这里,要求p(不帅、性格不好、身高矮、不上进|嫁)的所需项全部求出来了,下面我带入进去即可,
= (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)
下面我们根据同样的方法来求p(不嫁|不帅,性格不好,身高矮,不上进),完全一样的做法,为了方便理解,我这里也走一遍帮助理解。首先公式如下:
下面我也一个一个来进行统计计算,这里与上面公式中,分母是一样的,于是我们分母不需要重新统计计算!
p(不嫁)=?根据统计计算如下(红色为满足条件):
则p(不嫁)=6/12 = 1/2
p(不帅|不嫁) = ?统计满足条件的样本如下(红色为满足条件):
则p(不帅|不嫁) = 1/6
p(性格不好|不嫁) = ?据统计计算如下(红色为满足条件):
则p(性格不好|不嫁) =3/6 = 1/2
p(矮|不嫁) = ?据统计计算如下(红色为满足条件):
则p(矮|不嫁) = 6/6 = 1
p(不上进|不嫁) = ?据统计计算如下(红色为满足条件):
则p(不上进|不嫁) = 3/6 = 1/2
那么根据公式:
p (不嫁|不帅、性格不好、身高矮、不上进) = ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)
很显然(1/6*1/2*1*1/2) > (1/2*1/6*1/6*1/6*1/2)
于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)
所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!
5 朴素贝叶斯分类的优缺点
优点:
(1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化医学即可!)
(2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
朴素贝叶斯分类器的一个重要假定:分类对应的各个属性间是相互独立的,然而在现实应用中,这个往往难以做到,那怎么办呢?
半朴素贝叶斯分类
很简单,适当考虑一部分属性间的相互依赖关系,这种放松后的分类称为半朴素贝叶斯分类,其中最常用的策略:假定每个属性仅依赖于其他最多一个属性,称其依赖的这个属性为其超父属性,这种关系称为:独依赖估计(ODE)。
因此,对某个样本x 的预测朴素贝叶斯公式就由如下:
修正为如下的半朴素贝叶斯分类器公式:
从上式中,可以看到类条件概率 P(xi | c) 修改为了 xi 依赖于分类c 和 一个依赖属性pai 。
半朴素贝叶斯例子解释
在阐述朴素贝叶斯分类器用到的数据集还是用到此处,数据集如下:
# | 大小 | 颜色 | 形状 | 标签 |
---|---|---|---|---|
1 |
小 |
青色 | 非规则 | 否 |
2 | 大 | 红色 | 非规则 | 是 |
3 | 大 | 红色 | 圆形 | 是 |
4 | 大 | 青色 | 圆形 | 否 |
5 | 大 | 青色 | 非规则 | 否 |
6 | 小 | 红色 | 圆形 | 是 |
7 | 大 | 青色 | 非规则 | 否 |
8 | 小 | 红色 | 非规则 | 否 |
9 | 小 | 青色 | 圆形 | 否 |
10 | 大 | 红色 | 圆形 | 是 |
测试集上要预测的某个样本如下:
# | 大小 | 颜色 | 形状 | 标签 |
---|---|---|---|---|
11 |
大 |
青色 | 圆形 | ? |
采用拉普拉斯修正后的先验概率P(c)的计算公式:
基于类c和类外的依赖属性pai的条件概率计算公式如下:
属性的依赖关系定义如下:
-
大小的依赖属性为:形状,且属性取值为大时依赖形状为圆形;
-
颜色不存在依赖属性;
-
形状的依赖属性为大小,且属性取值为圆形时依赖大小为大;
则先验概率 P(c) ,
P(c = 好果)= (4+1) / (10+2) = 5/12
P(c = 一般) = (6+1) / (10+2) = 7/12
带有依赖属性的类条件概率:
P(大小=大 | c=好果,形状=圆形) = (2+1)/(3+2) = 3/5
P(颜色=青色 | c=好果) = (0+1)/(4+2) = 1/6
P(形状=圆形 | c=好果,大小=大) = (2+1) / (3+2) = 3/5
P(大小=大 | c=一般,形状=圆形) = (1+1) /( 2+2) = 2/4
P(颜色=青色 | c=一般) = (5+1)/(6+2) = 6/8
P(形状=圆形 | c=一般,大小=大) = (1+1)/(3+2) = 2/5
因此:
P(c=好果) * P(大小=大 | c=好果,形状=圆形) * P(颜色=青色 | c=好果) * P(形状=圆形 | c=好果,大小=大)
= 5/12 * 3/5 * 1/6 * 3/5
= 0.025
P(c=一般) * P(大小=大 | c=一般,形状=圆形) * P(颜色=红色 | c=一般) * P(形状=圆形 | c=一般,大小=大)
= 7/12 * 2/4 * 6/8 * 2/5
= 0.0875
因此,测试集上要预测的这个样本和朴素贝叶斯分类器要预测的结果是相同的,都为一般的果子。
这种依赖属性选取算法称为超父ODE算法:SPODE。显然,这个算法是每个属性值只与其他唯一 一个有依赖关系。基于它之上,又提出另一种基于集成学习机制,更为强大的独依赖分类器,AODE,它的算法思想是怎么样的呢?
AODE算法
这个算法思路很简单,就是在SPODE算法的基础上在外面包一个循环吧,说的好听点就是尝试将每个属性作为超父属性来构建SPODE吧,请看下面的公式,是不是在SPODE外面包了一个循环,然后求它们的和作为当前预测样本的得分值啊:
上面的求和符号实质兑换为代码不就是一个for循环吗。
总结和展望
以上介绍了考虑属性间有依赖关系时的半朴素贝叶斯分类器。结合近几天的阐述,这些(半)朴素贝叶斯分类器,都有一个共同特点:假设训练样本所有属性变量的值都已被观测到,训练样本是完整的。
然后,现实生活中,有时候拿到的数据集缺少某个属性的观测值(这种变量称为隐变量),在这种存在“未观测”变量的情形下,是否仍能对模型参数进行估计呢?
比如,两箱苹果,其中从A箱中取到一个好苹果的概率大于从B箱中取得,如果有一堆苹果来自于A箱和B箱,但是不知道某个苹果来自于A箱还是B箱,进行了5组实验,每组抽取10个苹果,每组抽到的好苹果和一般苹果都记录到纸上,通过这些观测数据,能得出从A或B箱中取到一个好苹果的概率吗?
这个预测,无形中增加了一个隐变量:苹果出处这属性吧(取值:A箱或B箱)。在这种情况下,介绍一种常用的估计类似参数隐变量的利器:Expectation-Maximization 算法(期望最大算法)。EM算法正如它的名字那样每轮迭代经过两步:E步和M步,迭代,直至收敛。
谢谢您的阅读!