贝叶斯网络和马尔科夫的冷知识

贝叶斯原理

介绍贝叶斯网络前,我们先说一下贝叶斯定理。我们在大学学概率论的时候就听过贝叶斯定理了。
在贝叶斯中,经常提到的就是条件概率,也叫作后验概率。它的意思是事件A在事件B已经发生的条件下仍然发生的概率,表示为P(A|B),读作“在B条件下A的概率”。

先验概率:通过经验来判断事情发生的概率,就是先验概率,再比如南方的梅雨季是 6-7 月,就是通过往年的气候总结出来的经验,这个时候下雨的概率就比其他时间高出很多。
后验概率:后验概率就是发生结果之后,推测原因的概率。它是属于条件概率的一种。
条件概率:事件 A 在另外一个事件 B已经发生条件下的发生概率,表示为 P(A|B),读作“在 B 发生的条件下 A 发生的概率”。

朴素贝叶斯

接下来我们讲一下算法的核心思想,朴素贝叶斯是什么。朴素贝叶斯是一种简单但是却很强大的预测建模算法。因为它们之间的变量是独立的,所以它称作朴素贝叶斯。但这是一个强硬的假设,实际情况并不一定符合,但是这项技术对于绝大部分的复杂问题仍然非常有效。在日常生活中,如果我们遇见一个陌生人。一般要判断这个人的性别,那么根据经验,我们就会以身高、体重、鞋码、头发长短、声音等角度来判断。

如果我们没有假定特征之间是相互独立的,会怎么样呢:

首先:

假设这里有一个例子具备4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为233*2=36个。36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。

其次:

倘若特征之间没有相互独立,我们做统计的时候就要去整个特征空间中去寻找。由于数据的稀疏性,很容易统计到0的情况。

贝叶斯分类

贝叶斯分类,也叫贝叶斯网络又叫做有向无环图模型,是一种概率图模型,有向无环图中的每个节点表示随机变量,它们可以是可观察到的变量或者隐藏变量,未知参数等。若两个节点之间可以用一个单向的箭头连接,就认为它们之间是因果关系,并且它们的关系是独立的。一个节点代表因,另一个节点代表果,两个节点就会产生一个条件概率。这样就形成了贝叶斯网络。

在sklearn 机器学习包中,给我们提供了 3 个朴素贝叶斯分类算法,分别是
高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。
这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:

  • 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。
  • 多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF
    值等。(TF是指词频,也就是一个单词在文档中出现的次数。在NLP中,一般认为一个单词出现的次数与它的重要性成正比。而IDF是逆向文档频率,是指一个单词在文档中的区分度。如果一个单词在一个文档中出现的次数越少,那么就容易通过这个单词将这个文档和其他文档区分开。IDF
    越大就代表该单词的区分度越大。)
  • 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现。

伯努利朴素贝叶斯是以文件为粒度,如果该单词在某文件中出现了即为 1,否则为
0。而多项式朴素贝叶斯是以单词为粒度,会计算在某个文件中的具体次数。而高斯朴素贝叶斯适合处理特征变量是连续变量,且符合正态分布(高斯分布)的情况。比如身高、体重这种自然界的现象就比较适合用高斯朴素贝叶斯来处理。而文本分类是使用多项式朴素贝叶斯或者伯努利朴素贝叶斯。

在这里插入图片描述
对于朴素贝叶斯来说,算法逻辑简单,只要使用贝叶斯公式转化就可以了,而且在分类过程中时空开销小(特征相互独立,只会涉及到二维存储)。在文本分类,情感预测上经常使用,特别是在英文等语言上分类效果很好。

import numpy as np 
import math
# 使用词集法进行贝叶斯分类
# 构造数据集,分类是侮辱性 or 非侮辱性
def loadDataset () :
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
    return postingList, classVec


# 创建一个包涵所有词汇的列表 , 为后面建立词条向量使用
def createlist (dataset) :
    vovabset = set ([])
    for vec in dataset :
        vovabset = vovabset | set (vec)
    return list (vovabset)

# 将词条转化为向量的形式
def changeword2vec (inputdata, wordlist) :
    returnVec = [0] * len (wordlist)
    for word in inputdata :
        if word in wordlist :
            returnVec[wordlist.index(word)] = 1
    return returnVec

# 创建贝叶斯分类器 
def trainNBO (dataset, classlebels) :
    num_of_sample = len (dataset)
    num_of_feature = len (dataset[0])
    pAusuive = sum (classlebels) / num_of_sample # 侮辱性语言的概率
    p0Num = np.ones (num_of_feature)
    p1Num = np.ones (num_of_feature)
    p0tot = num_of_feature
    p1tot = num_of_feature
    for i in range (num_of_sample) :
        if classlebels[i] == 1 :
            p1Num += dataset[i]
            p1tot += sum (dataset[i])
        else :
            p0Num += dataset[i]
            p0tot += sum (dataset[i])   
    p0Vec = p0Num / p0tot
    p1Vec = p1Num / p1tot
    for i in range (num_of_feature) :
        p0Vec[i] = math.log (p0Vec[i])
        p1Vec[i] = math.log (p1Vec[i])
    return p0Vec, p1Vec, pAusuive


#  定义分类器 
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0

# 测试代码 
dataset,classlebels = loadDataset ()
wordlist = createlist (dataset)
print (wordlist)
print (changeword2vec (dataset[0], wordlist))
trainmat = []
for temp in dataset :
    trainmat.append (changeword2vec (temp,wordlist))
p0V, p1V, pAb = trainNBO (trainmat, classlebels)
print (p0V)
print (p1V)
print (pAb)

为什么要将贝叶斯和马尔科夫放在一起讲呢,因为它们都是涉及到图模型的算法。我们先理清这几个概念:
1.将随机变量作为结点,如果他们之间是相关的,或者不独立,就将他们练成一条线;如果给定若干个随机变量,那么这样就会形成一个有向图,也就是网络。
2.如果这个网络是有向无环图,就称之为贝叶斯网络。
3.如果这个图退化成线性链的方式,就可以得到马尔科夫模型;因为其中的每一个结点都是随机变量,当将这些看成每个时刻或者空间的相关变化,叫做马尔科夫过程。
4.如果这个网络是无向的,就是无向图模型,又称作马尔科夫随机场或者马尔科夫网络。

马尔科夫

上面说了,有向图的模型叫做贝叶斯网络,没有方向的模型就叫马尔科夫随机场或者马尔科夫网络,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的统计工具。到目前为止,它一直被认为是实现快速精确的语音识别系统的最成功的方法。
马尔科夫过程是一类随机过程,它代表在目前这个已知的状态下,它接下来这个时刻的状态不会依赖于当下它这个过去的状态。如液体中微粒所作的布朗运动、传染病受感染的人数、车站的候车人数等,都可视为马尔可夫过程。
每个状态的转移只依赖于之前的n个状态,这个过程被称为1个n阶的模型,其中n是影响转移状态的数目。最简单的马尔可夫过程就是一阶过程,每一个状态的转移只依赖于其之前的那一个状态,这个也叫作马尔可夫性质。

隐马尔科夫又是什么?

听过马尔科夫,又听到了隐马尔科夫,那么这个隐马尔科夫又是什么来的?隐马尔科夫模型是一类基于概率统计的模型,是一种结构最简单的动态贝叶斯网,是一种重要的有向图模型。自上世纪80年代发展起来,在时序数据建模,例如:语音识别、文字识别、自然语言处理等领域广泛应用。
这个模型可以用三个参数来确定:

  1. .初始状态概率向量;
  2. .初始状态转移概率矩阵,也就是在任意时刻t的状态下,下一时刻将成为什么状态的概率,这个概率是固定的,不随时间变化而变化;
  3. 输出观测概率矩阵,模型根据当前状态获得各个观测值的概率。

同样,隐马尔科夫也有三个重要假设:

  1. 当前观测值只由当前隐藏状态确定,而与其他隐藏状态或观测值无关(隐藏状态假设)
  2. 当前隐藏状态由其前一个隐藏状态决定(一阶马尔科夫假设)
  3. 隐藏状态之间的转换函数概率不随时间变化(转换函数稳定性假设)

通过隐马尔科夫,主要研究三个问题:
1.估算问题: 在给定HMM的参数(S V A B π)和观测序列O = (o1,o2,……oT)的情况下,如何有效的计算出观测序列的概率,即P(O | 入)?
解决办法:前向-后向算法(一种动态规划算法)。
2.解码问题: 在给定HMM的参数(S V A B π)和观测序列O = (o1,o2,……oT)的情况下,如何寻找一个状态转换序列q =
(q1,q2,……qT),使得该状态转换序列最有可能产生上述观测序列?
解决办法:Viterbi算法(一种动态规划算法)。
3.学习问题:
在模型参数未知或者不准确的情况下,如何根据观测序列O =
(o1,o2,……oT)得到模型参数或者是调整模型参数,即如何确定一组模型参数’入*’使得P(O | 入*)达到最大?
解决办法:如果状态序列已知,那用最大似然估计,但隐马尔科夫的状态序列未知,即含有隐变量,所以要使用Baum-welch算法(中文名好像叫鲍姆-韦尔奇,这个算法本质也是EM算法)。

在最后,就和大家介绍一下什么是生成式模型,什么是判别式模型?

生成式模型和判别式模型的区别

判别模型(discriminative model)通过求解条件概率分布P(y|x)或者直接计算y的值来预测y。

线性回归(Linear Regression),逻辑回归(Logistic Regression),支持向量机(SVM), 传统神经网络(Traditional Neural Networks),线性判别分析(Linear Discriminative
Analysis),条件随机场(Conditional Random Field)

生成模型(generative model)通过对观测值和标注数据计算联合概率分布P(x,y)来达到判定估算y的目的。

朴素贝叶斯(Naive Bayes), 隐马尔科夫模型(HMM),贝叶斯网络(Bayesian Networks)和隐含狄利克雷分布(Latent Dirichlet Allocation)、混合高斯模型

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值