分类算法:
使用训练集(数据元组+对应类标号),选用某种分类算法进行监督学习,得到一个分类器;再使用和训练集没有重合的检验集来使用分类器分类,检验分类器的准确率。如果准确率可以接受,那这个分类器就可以用啦。
朴素贝叶斯分类法:
用途:给定一个元组,可以计算出这个元组最应该被分到哪个类。使用条件概率来度量“应该程度”
原理:利用贝叶斯公式算出以给定元组矢量值为条件,在训练集上计算出现类i的概率,能使这个条件概率取最大值的类i就是该元组应该被分到的类。
基于类条件独立性的假定+贝叶斯定理,因此名叫朴素+贝叶斯。
类条件独立性:假定一个数据的各个属性对分类标号的影响是相互独立的。(其实也就是每个属性的取值之间没有相关性。和统计学中的条件概率要求随机事件之间相互独立是一回事)
贝叶斯定理公式(也就是条件概率公式):P(A|B)=P(B|A)*P(A)/P(B)
大白话版本:朴素贝叶斯分类法,其实是提供打了标签的历史数据(这里就是训练集),然后对一条未打标签的新数据,利用条件概率算算这条历史数据中这条新数据的取值条件下应该被打上每种标签的概率,哪个概率最高就打哪个。
一些脑中预定义的感知:
1、每个元组都是一个向量,提供了这一条数据在不同属性维度上的取值。
2、具体有多少种分类是已知的:就看训练集上的类标号有多少种。
3、训练集数据提供:很多n维向量+每个向量对应的类标号,其实都可以理解成有很多n+1维向量,只不过其中一维是类标号这个特殊的属性。
4、于是:用C来表示类标号,现有m种分类结果(C1,C2,…,Cm),一个待求概率的n维向量X(在各维度上的值分别为x1,x2,…,xn),求发生X的条件下,类标号上出现Ci的条件概率,也就是对每条数据求m个条件概率,概率最大的Ci就是这个向量X的分类结果。
5、朴素贝叶斯分类器可以说是不存在训练的过程,一堆打了标签的数据加上贝叶斯公式其实就是分类器本器了。
具体思路:
1、这个问题下的公式写作:P(Ci|X)=P(X|Ci)P(Ci)/P(X)
2、比较哪个Ci能使P最大,只是个比较问题,不需要每个P都求出具体值。而每个P都有1/P(X)这个大于0小于1的因子,所以计算时可以同时忽略这个因子。于是问题转化为求哪个P(X|Ci)P(Ci)最大。
3、P(Ci)很好求, 看所有数据里属性C中C=Ci的占比就可以了
4、P(X|Ci)并不好求:因为X是个n维向量,对于每个元组依次匹配各个维度上的取值,在n很大的时候开销就变很大了。而发生Ci的条件下出现(x1,x2,…,xn)的概率,换个描述法就是发生Ci条件下,出现x1且x2且x3且…且xn的概率。于是这时引入了“朴素”的假设:假设这些且的属性怎么取值是相互独立的,那么P(X|Ci)=P(x1|Ci)P(x2|Ci)…P(xn|Ci),而这里的每一项P(xk|Ci)都是很容易求出来的。
5、对求出来的m个P找到最大的那个Ci
问题细节:
a)前面所述是针对属性值是离散值的情况,当属性值是连续值时,有两种办法:
1、使用分箱等离散化方法把属性值分成几类,于是转化成离散值
2、假定连续值属性服从正态分布,那么由训练集数据可以求出正态分布的均值和方差,也就确定了正态分布的概率公式,把xk代进公式就得到概率啦
b)遇到零概率值:
如果乘积的因子中出现一个零概率值,那其余所有的因子就算再大,这个乘积也只能是0了,这显然是不合理的。
解决办法:
laplace校准:假设训练集非常大,那么对于出现0值的这种属性k-类标号Ci情况,如果属性k有t种取值,那就假设多了t条数据,它们分别是xk取t种取值,类标号为Ci的。这样再算概率,就会把0值变成一个合理的小值,非零值基本没变,这种校准方法还是很合理哒。
代码实现:
放到实际问题里基本就是很多查询语句select count(*)完了再各种求比值求乘积,没什么好实现的。
算法评价:
1、某些领域,它的准确率跟决策树或是神经网络这些复杂的分类算法可以相媲美了
2、假设类条件独立,但现实中不可能属性间都独立的,这是个局限
3、朴素贝叶斯分类器的思想,可以说是,计算已给特定值的数据 映射到 类标号集上的贴合程度,最贴合的就是结果。朴素贝叶斯里的贴合程度用条件概率来描述。基于这个思想应该还可以用其他的模型或是公式来求这个“贴合程度值”。总之公式很简单,思想很基本,但思想又很经典。