我与机器学习 - [Today is Bayes] - [贝叶斯]

基于贝叶斯决策理论的分类方法

优点:在数据较少的情况下仍然有效,可以处理多类别问题

缺点:对于输入数据的准备准备方式较为敏感

朴素贝叶斯是贝叶斯决策理论的一部分,我们用p1(x, y)表示数据点(x,y)属于第一类别,用p2(x,y)表示数据点属于第二类别,现在有一个新的数据点(x,y),可以用下面的规则来判断他的类别。

如果p1(x,y) > p2(x,y) 那么属于类别1

如果p2(x,y) > p1(x,y)那么属于类别2

也就是说会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

朴素贝叶斯建立在特征之间相互独立基础假设上的,由统计学知道,如果每个特征需要N个样本,那么对于十个特征将会需要N **10个样本,可以看到,所需要的样本数会随着特征数目增大而迅速增长。

但是如果假设特征之间相互独立,那样样本就可以从N**10下降到10 * N个,所谓独立指的是统计意义熵的独立,即一个特征或者单词出现的概率和他上一个特征或者其他相邻单词没有关系。而独立的这个假设正式朴素贝叶斯中朴素(naive)的含义。朴素贝叶斯的另一个假设是每个特征同等重要。

前期准备工作:

训练词典,将大量文章分好词后,制作词典。

伪代码:

      创建一个空集set,这个集合就是最后输出的词典set

      遍历所有的词条:

            对于每个词条求当前词典set和新词条的并集,新词条要使用set过滤重复单词

      返回词典set

训练完成词典后,需要做的是对输入的测试词条要转化成和词典同大小的向量

伪代码:

      创建一个和词典同大小的list,元素全部为0的词向量

      遍历输入的词条中的单词

            对于每个单词判断其是否在词典中

                  如果在词典中,则获取词典中该单词的下标,令词向量该下标的数值等于1

      返回词向量

然后就是训练的算法了

首先看一下训练所依据的数学理论,看下面这段文字就可以

 其中,p(w1|c1)表示在类别1发生的条件下。单词1出现的频率,这里不太好理解,就是说,判断一个训练的词向量,如果他是第一个类别,就计算单词1的数目,除以第一个类别中词的总数目

训练过程的伪代码:思路就是计算贝叶斯公式中的未知量p(ci)和p(wi|ci)

      计算该类别占所有类别的数目即为p(ci)

      初始化大小等于词典长度,大小全为0的词向量,数目应该等于类别的数目

      遍历训练数据

            对每一个训练数据词条,获取该词条的类别

            在该类别发生的前提下,计算每一个单词在该类别全部单词中所占的比重,也就是p(wi|ci)

      返回p(ci)和p(wi|ci)

在计算的过程中因为要计算每一个单词在该类别单词数量所占比重的乘积,即计算p(w1|c1),p(w2|c1),p(w3|c1)

的乘积,如果其中一个为0则算出来也为0,为降低这种影响,可以将所有次的出现次数初始化为全1,将分母初始化为2

还有就是如果一个单词在该类别所有单词的比重很小,会造成很多很小的数相乘,造成下溢出,可以对乘积取自然对数。

ln(a * b) = ln(a)+ln(b)

以上部分小结:对于分类而言,有时候使用概率比使用硬规则更为有效,贝叶斯概率以及贝叶斯准则提供了一种利用已知值来估计位置概率的方法,通过条件之间的独立性假设,降低对数据量的需求。

以上部分代码:https://github.com/HanGaaaaa/MLAProject/tree/master/Bayes

进阶部分:

相对熵,又称为互熵,交叉熵,鉴别信息,Kullback熵,Kullback- Leible散度等等

公式为:

相对熵都是大于0的,两个概率分布反过来的相对熵不相等,相对熵可以用来度量连个随机变量的距离 。

由相对熵引出互信息:两个随机变量的互信息定义为这两个随机变量的联合分布和这两个随机变量独立分布乘积的相对熵

公式:

复习信息增益:信息增益是指,在知道特征A的情况下,对数据集D的不确定性减少的程度 

由贝叶斯公式带来的思考:

其中第二个等式的化简就用于上半部分算法的实现。 

贝叶斯网络:

把某个系统的随机变量,根据是否条件独立,绘制在一个有向图中,就形成了贝叶斯网络,只是单纯一个网络。

一般而言,贝叶斯网络的有向无环图中,节点表示随机变量,连接两个节点之间的箭头表示两个变量直接是具有因果关系的(非条件独立)

一个简单的贝叶斯网络:

这个也叫全连接贝叶斯网络C32 3*2 /2 = 3 条边,即每一对节点之间都有连接

但是更多时候一个正常的贝叶斯网络一般是这个样子的:

利用贝叶斯网络计算概率:

三种利用贝叶斯网络来判断独立性的情况

第一种  T2T样式

第二种 H2T样式

第三种 H2H样式

D-separation 有向分离

上述三种情况是节点与节点之间,也可以推广到集合与集合之间。 

再看朴素贝叶斯,首先是假设部分:

利用贝叶斯公式得到:

得到朴素贝叶斯算法的核心就是,想要求得某个样本属于某个类别的概率,只要求得该类别在所有类别中的概率乘以该类别下每个特征出现的频率,

进一步推导:

 此时就是求p(y)和p(xi | y),p(y)其实就是该类别的样本数目除以样本总数目,即该类别所占的比重。

而p(xi | y)就是在该类别内的样本,特征xi出现的频率

当p(xi | y)服从高斯分布时,会求得该类别的均值和方差,就是模型的参数:

 当p(xi | y)服从多项分布时,就是求该类别下某个特征出现的次数除以该类别下所有特征出现的次数,就是模型的参数:

这里的拉普拉斯平滑, 下面还会讲一下,就是上半部分提到的一些处理里面的把初始值都设为1的做法。

朴素贝叶斯的推导就是这些,下面再看看邮件分类系统

首先处理所有文本得到词典和把训练数据每一条都输出成词向量:

然后计算模型的参数 p(c) 和 p(x | c):

 p(x | c)要怎么算呢,这里用到了拉普拉斯平滑:

拉普拉斯平滑能够避免0/0带来的算法异常,例如洛杉矶湖人队和勇士队两只球队在过去打过5场比赛,其中洛杉矶赢过3场,勇士赢过2场,这时候估计第六场的胜率时,不需要拉普拉斯平滑,因为估计湖人队胜率为3/5,勇士2/5,但是如果过去5场比赛,湖人胜了5场,勇士胜了0场,这时候估计第六场胜率时,湖人的胜率会估计为1,显然这不太科学,这时候就体现出拉普拉斯平滑的作用,我们可以初始给湖人和勇士的胜场都加1,这时候总场数为 湖人(6场),勇士(1场) 6+1等于7场,湖人胜率为6/7,勇士胜率为1/7,这样显然数据更加科学。所以,在做拉普拉斯平滑时,分子和分母都要同时变化,保证概率和为1. 

下半部分代码:

https://github.com/HanGaaaaa/MLAPractice/tree/master/BayesNetwork

猜你喜欢

转载自blog.csdn.net/weixin_43409627/article/details/84853188