朴素贝叶斯法(1) 之 基础概念

笔记来自《统计学习方法》第四章。

大体分析

朴素贝叶斯的优缺点

优点:

  • 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。

  • NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。

缺点:

  • 理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的(可以考虑用聚类算法先将相关性较大的属性聚类),这给NBC模型的正确分类带来了一定影响。在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。

  • 需要知道先验概率。

  • 分类决策存在错误率

朴素贝叶斯

联合概率分布

联合概率分布可以由先验概率和条件概率来得到:
P(X,Y)=P(Y)P(X|Y)
也就是说,只要知道了先验概率分布P(Y)和条件概率分布P(X|Y),就可以算出联合概率分布,而先验概率分布和条件概率分布可以由极大似然估计或者贝叶斯估计得出。

极大似然估计

极大似然估计就是通过事件发生的频率来估计事件发生的概率:
\Large{{P(Y=c_k)=\frac{\sum_{i=1}^{N} I(y_i=c_k)}{N}}}\\ \Large{P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^{N} I(x_i^{(j)}=a_{jl},y_i=C_k)}{\sum_{i=1}^N I(y_i=c_k)}}

贝叶斯估计

由极大似然估计得到的概率,如果概率值为零的话,会影响到后验概率的计算(分母不能为零)

那么,在随机变量各个取值的频数上赋予一个正数\lambda>0,就可以避免这个问题:
\Large{{P(Y=c_k)=\frac{\sum_{i=1}^{N} I(y_i=c_k)+\lambda}{N+K\lambda}}}\\ \Large{P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^{N} I(x_i^{(j)}=a_{jl},y_i=C_k)}{\sum_{i=1}^N I(y_i=c_k)}}

在这里,\lambda=0时为极大似然估计,\lambda=1时是拉普拉斯平滑,其中的一些参数是,l=1,2,...,S_jk=1,2,...,K

朴素贝叶斯法

有了计算各个概率的方法之后,我们就可以去计算每一个P(Y=c_k|X=x),然后取值最大的那个概率对应的Y作为预测的结果。

在学习的时候,我们需要模型去学习一个机制,使得P(Y=c_k|X=x)能够最大,这就确保了,当系统接收到一个输入样本X=x的时候,系统最可能给出正确的分类答案,即Y=c_k

有极大似然估计或者贝叶斯估计,我们可以计算出P(X=x|Y=c_k)P(Y=c_k),那么我们怎么才能得到P(Y=c_k|X=x)呢?

由贝叶斯公式(或者贝叶斯定理),我们有:
\Large{P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_kP(X=x|Y=c_k)P(Y=c_k)}}
而我们知道,任何一个输入的样本都可以被表示为一个n维向量,那么条件概率分布:
P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k),\ \ \ k=1,2,...,K
而在朴素贝叶斯法中,对条件概率分布做了条件独立性的假设,那么就有:
\begin{align} \large{P(X=x|Y=c_k)=P(X^{(1)}=}&\large{x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k)}\\ \large{=}&\large{\prod_{j=1}^nP(X^{(i)}=x^{(i)}|Y=c_k)} \end{align}
于是乎:
\Large{P(Y=c_k|X=x)=\frac{P(Y=c_k)\prod _jP(X^{(j)}=x^{(j)}|Y=c_k)}{\sum_kP(Y=c_k\prod_jP(X^{(j)}=x^{(j)}|Y=c_k)}}
省去不会变化的分母,朴素贝叶斯分类器可以表示为:
\Large{y=\arg \max_{c_k}P(Y=c_k)\prod _jP(X^{(j)}=x^{(j)}|Y=c_k)}
也就是说,找到一个y=c_k,使得上式最大化即可,这个y就是分类器预测的结果。

例题

书中给出了两个例子:参数未修正参数修正,两种场景的估计,都是三步走,一样的套路。

问题描述:

image

参数未修正

第一步:类别信息

image

第二步:不同类别的特征信息

image

第三步:不同类别概率估计

image

参数修正:这里

image

第一步:类别信息

image

第二步:不同类别的特征信息

image

第三步:不同类别概率估计

image

Python 实现

import numpy as np

#构造NB分类器
def Train(X_train, Y_train, feature):
    global class_num,label
    class_num = 2           #分类数目
    label = [1, -1]         #分类标签
    feature_len = 3         #特征长度
    #构造3×2的列表
    feature = [[1, 'S'],    
               [2, 'M'],
               [3, 'L']]

    prior_probability = np.zeros(class_num)                         # 初始化先验概率
    conditional_probability = np.zeros((class_num,feature_len,2))   # 初始化条件概率
    
    positive_count = 0     #统计正类
    negative_count = 0     #统计负类
    for i in range(len(Y_train)):
        if Y_train[i] == 1:
            positive_count += 1
        else:
            negative_count += 1
    prior_probability[0] = positive_count / len(Y_train)    #求得正类的先验概率
    prior_probability[1] = negative_count / len(Y_train)    #求得负类的先验概率
    
    '''
    conditional_probability是一个2*3*2的三维列表,第一维是类别分类,第二维和第三维是一个3*2的特征分类
    '''
    #分为两个类别
    for i in range(class_num):
        #对特征按行遍历
        for j in range(feature_len):
            #遍历数据集,并依次做判断
            for k in range(len(Y_train)): 
                if Y_train[k] == label[i]: #相同类别
                    if X_train[k][0] == feature[j][0]:
                        conditional_probability[i][j][0] += 1
                    if X_train[k][1] == feature[j][1]:
                        conditional_probability[i][j][1] += 1

    class_label_num = [positive_count, negative_count]  #存放各类型的数目
    for i in range(class_num):
        for j in range(feature_len):
            conditional_probability[i][j][0] = conditional_probability[i][j][0] / class_label_num[i]  #求得i类j行第一个特征的条件概率 
            conditional_probability[i][j][1] = conditional_probability[i][j][1] / class_label_num[i]  #求得i类j行第二个特征的条件概率

    return prior_probability,conditional_probability

#给定数据进行分类
def Predict(testset, prior_probability, conditional_probability, feature):
    result = np.zeros(len(label))
    for i in range(class_num):
        for j in range(len(feature)):
            if feature[j][0] == testset[0]:
                conditionalA = conditional_probability[i][j][0]
            if feature[j][1] == testset[1]:
                conditionalB = conditional_probability[i][j][1]
        result[i] = conditionalA * conditionalB * prior_probability[i]

    result = np.vstack([result,label])

    return result


def main():
    X_train = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],  [1, 'S'],
               [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'],  [2, 'L'],
               [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'],  [3, 'L']]
    Y_train = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]   

    #构造3×2的列表
    feature = [[1, 'S'],    
               [2, 'M'],
               [3, 'L']]

    testset = [2, 'S']
    
    prior_probability, conditional_probability= Train(X_train, Y_train, feature)
    
    result = Predict(testset, prior_probability, conditional_probability, feature)
    print(result)

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

推荐阅读更多精彩内容