请点击上面公众号,免费订阅。
主要推送关于对算法的思考以及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。
01
—
回顾
最近,阐述了朴素贝叶斯的2个例子引出了朴素贝叶斯的分类原理,给出了苹果的三个特征通过朴素贝叶斯分类器预测了第11个苹果是好果Or不好果,预测时发现某个分类中某个属性值恰好在数据集中没有出现,此时直接会抹去其他属性值,这个是不合理的,因此又论述了如何用拉普拉斯修正来解决这个问题,具体参考:
昨天,建立在以上对朴素贝叶斯分类器理解和消化的基础上,在Jupyter Notebook中亲自实践和实现了《自动单词拼写纠正器》,里面带有详细的原理说明和实现 python源码,有需要的可以@我,这个还是非常有趣的,最近距离的体会机器学习带给我们的快乐和兴趣,欢迎阅读和交流:
机器学习:单词拼写纠正器python实现
02
—
放松:属性独立假设
朴素贝叶斯分类器的一个重要假定:分类对应的各个属性间是相互独立的,然而在现实应用中,这个往往难以做到,那怎么办呢?
很简单,适当考虑一部分属性间的相互依赖关系,这种放松后的分类称为半朴素贝叶斯分类,其中最常用的策略:假定每个属性仅依赖于其他最多一个属性,称其依赖的这个属性为其超父属性,这种关系称为:独依赖估计(ODE)。
因此,对某个样本x 的预测朴素贝叶斯公式就由如下:
修正为如下的半朴素贝叶斯分类器公式:
从上式中,可以看到类条件概率 P(xi | c) 修改为了 xi 依赖于分类c 和 一个依赖属性pai 。
03
—
半朴素贝叶斯例子解释
在阐述朴素贝叶斯分类器用到的数据集还是用到此处,数据集如下:
# | 大小 | 颜色 | 形状 | 标签 |
---|---|---|---|---|
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,它的算法思想是怎么样的呢?
04
—
AODE算法
这个算法思路很简单,就是在SPODE算法的基础上在外面包一个循环吧,说的好听点就是尝试将每个属性作为超父属性来构建SPODE吧,请看下面的公式,是不是在SPODE外面包了一个循环,然后求它们的和作为当前预测样本的得分值啊:
上面的求和符号实质兑换为代码不就是一个for循环吗。
05
—
总结和展望
以上介绍了考虑属性间有依赖关系时的半朴素贝叶斯分类器。结合近几天的阐述,这些(半)朴素贝叶斯分类器,都有一个共同特点:假设训练样本所有属性变量的值都已被观测到,训练样本是完整的。
然后,现实生活中,有时候拿到的数据集缺少某个属性的观测值(这种变量称为隐变量),在这种存在“未观测”变量的情形下,是否仍能对模型参数进行估计呢?
比如,两箱苹果,其中从A箱中取到一个好苹果的概率大于从B箱中取得,如果有一堆苹果来自于A箱和B箱,但是不知道某个苹果来自于A箱还是B箱,进行了5组实验,每组抽取10个苹果,每组抽到的好苹果和一般苹果都记录到纸上,通过这些观测数据,能得出从A或B箱中取到一个好苹果的概率吗?
这个预测,无形中增加了一个隐变量:苹果出处这属性吧(取值:A箱或B箱)。在这种情况下,介绍一种常用的估计类似参数隐变量的利器:Expectation-Maximization 算法(期望最大算法)。EM算法正如它的名字那样每轮迭代经过两步:E步和M步,迭代,直至收敛。
谢谢您的阅读!
请记住:每天一小步,日积月累一大步!
交流思想,注重分析,看重过程,包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战,英语沙龙,定期邀请专家发推。期待您的到来!