贝叶斯式相亲

一天,小西找到小迪。

小西:小迪,最近我闺蜜的男朋友向她求婚了。

小迪:然后呢,她答应了吗?

小西:还没有呢,他们认识时间还不是很长。而且,我闺蜜觉得那个男生有些方面不符合她的择偶标准,她现在也是非常纠结呢!

小迪:婚姻还是要理性一点,如果她不知道该如何判断,或许朴素贝叶斯算法可以帮助她去理性得看待这个问题。

小西:朴素贝叶斯是什么?它是怎么帮助人类理性分析问题的呢?

小迪:贝叶斯分类算法是统计学的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种。其分类原理就是利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概率的类作为该特征所属的类。之所以称之为”朴素”,是因为贝叶斯分类只做最原始、最简单的假设:所有的特征之间是统计独立的。

小西:听上去还是非常多逻辑性呢!那我们该如何使用它呢?

小迪:那我们就以一个女生是否选择要嫁给一个男生为例解释一下这个算法。

13825820-9e7e7d283d2ad75e.png

一、概述

想要搞懂朴素贝叶斯算法,一定要先理解条件概率公式跟全概率公式,这两个公式在大学时候我们都学过,下面我们来回顾一下。

假设某样本X有a_1,a_2,…,a_n个属性,那么有P(X)=P(a_1,a_2,…,a_n) = P(a_1)*P(a_2)*…*P(a_n)。满足这样的公式就说明特征统计独立。

1. 条件概率公式

条件概率(Condittional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。

13825820-04de7b3ba2dc94c0.png

根据文氏图可知:在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

同理可得:

所以,

接着看全概率公式,如果事件A_1,A_2,A_3,…,A_n构成一个完备事件且都有正概率,那么对于任意一个事件B则有:

2. 贝叶斯推断

根据条件概率和全概率公式,可以得到贝叶斯公式如下:

P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。

P(B|A)/P(B)称为"可能性函数"(Likely hood),这是一个调整因子,使得预估概率更接近真实概率。

所以条件概率可以理解为:后验概率 = 先验概率 * 调整因子

如果"可能性函数">1,意味着"先验概率"被增强,事件A的发生的可能性变大;

如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;

如果"可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小。

3. 嫁?还是不嫁?这是一个问题……

下面我们就以“嫁不嫁”这个问题应用一下我们的朴素贝叶斯算法。

13825820-6c501d1b8c698b2d.jpg
颜值性格上进否嫁与否
上进
不帅一般不嫁
不帅不好不上进不嫁
一般
不帅上进
不好一般不嫁
不上进
不帅不好上进不嫁
不好上进
不帅不上进不嫁

上面这张表是根据女生根据假象男生的性格来决定是否嫁给他的标准信息表,我们利用这张表来针对特定男生的信息计算是否值得嫁的概率。

假设某个男生帅,性格不好,不上进,那么:

根据贝叶斯公式:

转换成分类任务的表达式:

<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="34.537ex" height="6.313ex" viewBox="0 -1610.3 14870.2 2718" role="img" focusable="false" style="vertical-align: -2.573ex;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g><g transform="translate(7494,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(8297,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g><g transform="translate(9489,0)"><g transform="translate(120,0)"><g transform="translate(60,715)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g></g><g transform="translate(1002,-803)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g></g></g></g></g></svg>

按照朴素贝叶斯的求解,可以转换为计算P(嫁|帅\ 性格不好\ 不上进)P(不嫁|帅\ 性格不好\ 不上进),最终选择嫁与不嫁的答案。

P(嫁|帅\ 性格不好\ 不上进)=P(嫁)\frac{P(帅|嫁)P(性格不好|嫁)P(不上进|嫁)}{P(帅\ 性格不好\ 不上进)}

P(不嫁|帅\ 性格不好\ 不上进)=P(不嫁)\frac{P(帅|不嫁)P(性格不好|不嫁)P(不上进|不嫁)}{P(帅\ 性格不好\ 不上进)}

分母的计算用到的是全概率公式:

所以P(帅\ 性格不好\ 不上进) = \P(嫁)P(帅|嫁)P(性格不好|嫁)P(不上进|嫁) \+ P(不嫁)P(帅|不嫁)P(性格不好|不嫁)P(不上进|不嫁)

由上面得出:

P(嫁)= 5/10 = 1/2

P(不嫁)= 5/10 = 1/2

P(帅|嫁) * P(性格不好|嫁) * P(不上进|嫁)= 4/5 * 1/5 * 1/5

P(帅|不嫁) * P(性格不好|不嫁) * P(不上进|不嫁) = 1/5 * 3/5 * 2/5

对于类别“嫁”的贝叶斯分子为:

P(嫁) * P(帅|嫁) * P(性格不好|嫁) * P(不上进|嫁) = 1/2 * 4/5 * 1/5 * 1/5 = 2/125

对于类别“不嫁”的贝叶斯分子为:

P(不嫁) * P(帅|不嫁) * P(性格不好|不嫁) * P(不上进|不嫁) = 1/2 * 1/5 * 3/5 * 2/5 = 3/125

所以最终结果为:

P(嫁|帅\ 性格不好\ 不上进) = (2/125) / (2/125 + 3/125) = 40%

P(不嫁|帅\ 性格不好\ 不上进) = (3/125) / (2/125 + 3/125) = 60%

60% > 40%,该女生选择不嫁。

13825820-e861c0109e9b17aa.png

二、朴素贝叶斯种类

小西:朴素贝叶斯就是根据先验概率与调整因子来确定概率的,是吧!

小迪:没错,但是朴素贝叶斯的形式确不止如此。在scikit-learn中,一共有3个朴素贝叶斯的分类算法。分别是GaussianNB,MultinomialNB和BernoulliNB。

1. GaussianNB

GaussianNB就是先验为高斯分布(正态分布)的朴素贝叶斯,假设每个标签的数据都服从简单的正态分布。

其中C_k为Y的第k类类别。\mu_k和\sigma_k^2为需要从训练集估计的值。

13825820-5a0199ca5d65e100.png

高斯分布图像

我们可以使用用scikit-learn简单实现一下GaussianNB。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" contenteditable="true" cid="n138" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">#导入包
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

导入数据集

from sklearn import datasets
iris=datasets.load_iris()


切分数据集

Xtrain, Xtest, ytrain, ytest = train_test_split(iris.data,
iris.target,
random_state=12)

建模

clf = GaussianNB()
clf.fit(Xtrain, ytrain)

在测试集上执行预测,proba导出的是每个样本属于某类的概率

clf.predict(Xtest)
clf.predict_proba(Xtest)

测试准确率

accuracy_score(ytest, clf.predict(Xtest))</pre>

2. MultinomialNB

MultinomialNB就是先验为多项式分布的朴素贝叶斯。它假设特征是由一个简单多项式分布生成的。多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征。该模型常用于文本分类,特征表示的是次数,例如某个词语的出现次数。

多项式分布公式如下:

其中,P(X_j=x_{jl}|Y=C_k)是第k个类别的第j维特征的第l个取值条件概率。m_k是训练集中输出为第k类的样本个数。\lambda 为一个大于0的常数,常常取为1,即拉普拉斯平滑。也可以取其他值。

3. BernoulliNB

BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,即如下式:

此时l只有两种取值。x_{jl}只能取值0或者1。

在伯努利模型中,每个特征的取值是布尔型的,即true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。

13825820-6a2acb212e67ee97.png

小西:那我们该在什么情况下分别使用这三种朴素贝叶斯模型呢?

小迪:一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

小西:原来如此。

注:所有图片均来源于网络

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值