朴素贝叶斯分类的拉普拉斯平滑

概念

零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是0。这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该事件的概率为0)。
拉普拉斯平滑(Laplacian smoothing) 是为了解决零概率的问题。
法国数学家 拉普拉斯 最早提出用 加1 的方法,估计没有出现过的现象的概率。
理论假设:假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题

具体公式

图片.png

总结:分子加一,分母加K,K代表类别数目。

应用场景举例

假设在文本分类中,有3个类:C1、C2、C3。
在指定的训练样本中,某个词语K1,在各个类中观测计数分别为0,990,10。
则对应K1的概率为0,0.99,0.01。
显然C1类中概率为0,不符合实际。
于是对这三个量使用拉普拉斯平滑的计算方法如下:

1/1003 = 0.001,991/1003=0.988,11/1003=0.011

在实际的使用中也经常使用加 λ(0≤λ≤1)来代替简单加1。如果对N个计数都加上λ,这时分母也要记得加上N*λ。

再来一个案例

一个男生的四个特征是长相不帅,性格不好,身高矮,不上进,我们最终得出的结论是女生不嫁!很多人说这是一道送分题,哈哈哈哈。我们可以用数学算法说明了不靠谱是取不到老婆滴!
那么我们来一个例子,假如此时另外一对情侣,这对情侣中,男生的四个特征是,长相帅,性格爆好,身高高,上进,那么他的女朋友嫁还是不嫁呢?可能又会有小伙伴说这是一道送分题,是不是,我们下面用事实说话!

下面通过例子来引出拉普拉斯平滑过程!

下面的训练数据:
image
四个特征集合分别长相{帅,不帅}、性格{爆好,好,不好}、身高{高,中,矮}、上进与否{上进,不上进}

我们此时要求出该男生在四个特征分别是长相帅,性格爆好,身高高,上进的情况下,他对应的嫁与不嫁的概率谁大谁小,从而得出结论!

也就是要比较p(嫁|长相帅,性格爆好,身高高,上进)与p(不嫁|长相帅,性格爆好,身高高,上进)的概率大小。
按照朴素贝叶斯算法公式,我们可以得到如下公式:
image
image

由于俩者的分母都是p(长相帅)、p(性格爆好)、p(身高高)、p(上进),那么我们可以不算分母,比较的时候只比较俩个公式分子大小即可。

好的,下面我们开始计算,先计算在四个特征的条件下,嫁的概率。

我们需要分别计算p(性格爆好|嫁)、p(长相帅|嫁)、p(身高高|嫁)、p(上进|嫁)

首先我们来算p(性格爆好|嫁)=?我们观察训练数据,发现如下:
image

居然没有一个数据有爆好这个特点的,那么p(性格爆好|嫁) = 0,那么我们可以看出问题了,根据公式:

image
我们最后的p(嫁|长相帅、性格爆好、身高高、上进)由于一项p(性格爆好|嫁)为0,而造成整个概率为0,这显然是错误的。
而这个错误的造成是由于训练量不足,会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准(这就引出了我们的拉普拉斯平滑),它的思想非常简单,就是对每个类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
引入拉普拉斯平滑的公式如下:
image
image
其中ajl,代表第j个特征的第l个选择,Sj 代表第j个特征的个数,K代表种类的个数。
λ为1,这也很好理解,加入拉普拉斯平滑之后,避免了出现概率为0的情况,又保证了每个值都在0到1的范围内,又保证了最终和为1的概率性质!
我们可以通过下面例子更加深刻的理解这个公式:(现在我们是加入拉普拉斯平滑

加入拉普拉斯平滑后

我们先需要分别计算p(性格爆好|嫁)、p(长相帅|嫁)、p(身高高|嫁)、p(上进|嫁),p(嫁)

p(性格爆好|嫁)=?统计满足要求的如下面红色部分
image
没有一个满足是性格爆好的条件,但是此时概率不为0,按照加入拉普拉斯平滑后的公式:
性格特征的个数为爆好,好,不好,三种情况,那么Sj 为3,则最终概率为1/9 (嫁的个数为6+特征个数为3
p(长相帅|嫁)=?统计满足条件的如下面红色部分:
image
由上图可知满足要求的为3个,按照加入拉普拉斯平滑后的公式:
长相特征的个数为帅,不帅,俩种情况,那么Sj 为2,则最终概率p(长相帅|嫁)为4/8 (嫁的个数为6+特征个数为2)
p(身高高|嫁) = ?统计满足条件的如下面红色部分:
image

由上图可知满足要求的为3个,按照加入拉普拉斯平滑后的公式:

身高特征的个数为高,中,矮情况,那么Sj 为3,则最终概率p(身高高|嫁)为4/9 (嫁的个数为6+特征个数为3)
p(上进|嫁)=?统计满足要求的如下面红色部分:
image
由上图可知满足要求的为5个,按照加入拉普拉斯平滑后的公式:
上进特征的个数为上进,不上进情况,那么Sj 为2,则最终概率p(上进|嫁)为6/8 (嫁的个数为6+特征个数为2)
p(嫁) = ?满足要求的如下红色标注:
image
由上图可知满足要求的为6个,按照加入拉普拉斯平滑后的公式:
种类的个数为嫁,不嫁情况,那么K为2,则最终概率p(嫁)为7/14 = 1/2 (嫁的个数为6+种类个数为2)

到这里为止,我们已经算出了在该男生条件下,嫁的概率为:

p(嫁|长相帅、性格爆好、身高高、上进) = 1/9*4/8*4/9*6/8*1/2

下面我们需要算出p(不嫁|长相帅、性格爆好、身高高、上进)的概率,然后与上面的数值进行比较即可,算法与上面完全一模一样!这里也走一遍。
我们需要估计出p(长相帅|不嫁)、p(性格爆好|不嫁)、p(身高高|不嫁)、p(上进|不嫁),p(不嫁)的概率分别为多少。
p(长相帅|不嫁)=?满足要求如下面红色标注:
image

由上图可知满足要求的为5个,按照加入拉普拉斯平滑后的公式:

长相帅特征的个数为不帅,帅情况,那么Sj 为2,则最终概率p(长相不帅|不嫁)为6/8 (不嫁的个数为6+特征个数为2)

p(性格爆好|不嫁)=?满足要求如下面红色标注:
image
没有一个满足是性格爆好的条件,但是此时概率不为0,按照加入拉普拉斯平滑后的公式:
性格特征的个数为爆好,好,不好,三种情况,那么Sj 为3,则最终概率p(性格爆好|不嫁)为1/9 (不嫁的个数为6+特征个数为3)
p(身高高|不嫁)=?满足要求如下面红色标注:
image
没有一个满足是身高高的条件,但是此时概率不为0,按照加入拉普拉斯平滑后的公式:
身高特征的个数为高,中,矮,三种情况,那么Sj 为3,则最终概率p(身高高|不嫁)为1/9 (不嫁的个数为6+特征个数为3)
p(上进|不嫁)=?满足要求如下面红色标注:
image
由上图可知满足要求的为3个,按照加入拉普拉斯平滑后的公式:
上进特征的个数为上进,不上进情况,那么Sj 为2,则最终概率p(上进|不嫁)为4/8 (不嫁的个数为6+特征个数为2)
p(不嫁)=?满足要求的如红色标注:
image
由上图可知满足要求的为6个,按照加入拉普拉斯平滑后的公式:
种类的个数为嫁,不嫁情况,那么K为2,则最终概率p(不嫁)为7/14 = 1/2 (不嫁的个数为6+种类个数为2)
到这里为止,我们已经算出了在该男生条件下,不嫁的概率为:
p(不嫁|长相帅、性格爆好、身高高、上进) = 5/8*1/9*1/9*3/8*1/2

结论

于是我们可以得到

p(嫁|长相帅、性格爆好、身高高、上进) = 1/94/84/96/81/2 > p(不嫁|长相帅、性格爆好、身高高、上进) = 6/8*1/9*1/9*4/8*1/2
于是我们可以大胆的告诉女生,这样的好男人,贝叶斯告诉你了,该嫁!!!
这就是我们使用拉普拉斯平滑后计算的整个算法过程!

python代码

from numpy import *

class NaiveBayesClassifier(object):
    
    def __init__(self):
        self.dataMat = list()
        self.labelMat = list()
        self.pLabel1 = 0
        self.p0Vec = list()
        self.p1Vec = list()

    def loadDataSet(self,filename):
        fr = open(filename)
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataLine = list()
            for i in lineArr:
                dataLine.append(float(i))
            label = dataLine.pop() # pop the last column referring to  label
            self.dataMat.append(dataLine)
            self.labelMat.append(int(label))


    def train(self):
        dataNum = len(self.dataMat)
        featureNum = len(self.dataMat[0])
        self.pLabel1 = sum(self.labelMat)/float(dataNum)
        p0Num = zeros(featureNum)
        p1Num = zeros(featureNum)
        p0Denom = 1.0
        p1Denom = 1.0
        for i in range(dataNum):
            if self.labelMat[i] == 1:
                p1Num += self.dataMat[i]
                p1Denom += sum(self.dataMat[i])
            else:
                p0Num += self.dataMat[i]
                p0Denom += sum(self.dataMat[i])
        self.p0Vec = p0Num/p0Denom
        self.p1Vec = p1Num/p1Denom

    def classify(self, data):
        p1 = reduce(lambda x, y: x * y, data * self.p1Vec) * self.pLabel1
        p0 = reduce(lambda x, y: x * y, data * self.p0Vec) * (1.0 - self.pLabel1)
        if p1 > p0:
            return 1
        else: 
            return 0

    def test(self):
        self.loadDataSet('testNB.txt')
        self.train()
        print(self.classify([1, 2]))

if __name__ == '__main__':
    NB =  NaiveBayesClassifier()
    NB.test()

生活很好,等你超越

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容