美文网首页
统计学习方法——修炼学习笔记4:朴素贝叶斯法

统计学习方法——修炼学习笔记4:朴素贝叶斯法

作者: Sam_L | 来源:发表于2020-03-27 10:05 被阅读0次

    一、朴素贝叶斯法

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
    对于给定数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型对给定输入x,利用贝叶斯定理求出后验概率最大的输出y。

    二、基本方法

    训练数据集:


    image.png

    由X和Y的联合概率分布P(X,Y)独立同分布**产生

    朴素贝叶斯法通过训练数据集T学习联合概率分布p(X,Y),

    先验概率分布

    image.png

    条件概率分布:

    image.png

    注:条件概率为指数级别的参数:


    image.png

    条件独立性假设:

    image.png

    朴素贝叶斯法是典型的生成模型,条件独立假设是说用于分类的特征在类确定的条件下都是条件独立的,这一假设是的朴素贝叶斯法变简单了,但是有时会牺牲分类准确性。

    贝叶斯定理:

    image.png

    朴素贝叶斯法分类基本公式(将条件独立性假设公式代入贝叶斯定理),有

    image.png

    贝叶斯分类器

    image.png
    分母对所有[图片上传中...(image.png-669c4-1585271759492-0)]
    都有Ck相同:
    image.png

    后验概率最大化的含义

    朴素贝叶斯法将实例分到后验概率最大的类中,等价于期望风险最小化。
    假设选择0-1损失函数:

    image.png
    期望风险函数:
    image.png
    由此取条件期望:
    image.png

    期望风险最小化(只需对X=x逐个极小化):

    image.png

    根据期望风险最小化准则得到后验概率最大化准则
    (朴素贝叶斯法采用的原理)

    image.png

    三、朴素贝叶斯法的参数估计

    极大似然估计

    应用极大似然法估计相应的概率
    先验概率

    image.png
    先验概率极大似然估计
    image.png

    条件概率的极大似然估计:

    image.png

    朴素贝叶斯算法

    输入

    image.png

    输出

    image.png
    实例x的分类
    image.png

    贝叶斯算法处理流程:


    image.png

    贝叶斯估计

    极大似然估计可能会出现所要估计的概率值为0的情况,会影响到后验概率的计算结果,使分类产生偏差。解决这一问题方法是采用贝叶斯估计
    条件概率的贝叶斯估计:


    image.png

    先验概率的贝叶斯估计:


    image.png

    【代码】

    #encoding=utf-8
    
    import pandas as pd
    import numpy as np
    import cv2
    import random
    import time
    
    from sklearn.cross_validation import train_test_split
    from sklearn.metrics import accuracy_score
    
    # 二值化
    def binaryzation(img):
        cv_img = img.astype(np.uint8)
        cv2.threshold(cv_img,50,1,cv2.cv.CV_THRESH_BINARY_INV,cv_img)
        return cv_img
    
    def Train(trainset,train_labels):
        prior_probability = np.zeros(class_num)                         # 先验概率
        conditional_probability = np.zeros((class_num,feature_len,2))   # 条件概率
    
        # 计算先验概率及条件概率
        for i in range(len(train_labels)):
            img = binaryzation(trainset[i])     # 图片二值化
            label = train_labels[i]
    
            prior_probability[label] += 1
    
            for j in range(feature_len):
                conditional_probability[label][j][img[j]] += 1
    
        # 将概率归到[1.10001]
        for i in range(class_num):
            for j in range(feature_len):
    
                # 经过二值化后图像只有0,1两种取值
                pix_0 = conditional_probability[i][j][0]
                pix_1 = conditional_probability[i][j][1]
    
                # 计算0,1像素点对应的条件概率
                probalility_0 = (float(pix_0)/float(pix_0+pix_1))*1000000 + 1
                probalility_1 = (float(pix_1)/float(pix_0+pix_1))*1000000 + 1
    
                conditional_probability[i][j][0] = probalility_0
                conditional_probability[i][j][1] = probalility_1
    
        return prior_probability,conditional_probability
    
    # 计算概率
    def calculate_probability(img,label):
        probability = int(prior_probability[label])
    
        for i in range(len(img)):
            probability *= int(conditional_probability[label][i][img[i]])
    
        return probability
    
    def Predict(testset,prior_probability,conditional_probability):
        predict = []
    
        for img in testset:
    
            # 图像二值化
            img = binaryzation(img)
    
            max_label = 0
            max_probability = calculate_probability(img,0)
    
            for j in range(1,10):
                probability = calculate_probability(img,j)
    
                if max_probability < probability:
                    max_label = j
                    max_probability = probability
    
            predict.append(max_label)
    
        return np.array(predict)
    
    
    class_num = 10
    feature_len = 784
    
    if __name__ == '__main__':
    
        print 'Start read data'
    
        time_1 = time.time()
    
        raw_data = pd.read_csv('../data/train.csv',header=0)
        data = raw_data.values
    
        imgs = data[0::,1::]
        labels = data[::,0]
    
        # 选取 2/3 数据作为训练集, 1/3 数据作为测试集
        train_features, test_features, train_labels, test_labels = train_test_split(imgs, labels, test_size=0.33, random_state=23323)
        # print train_features.shape
        # print train_features.shape
    
        time_2 = time.time()
        print 'read data cost ',time_2 - time_1,' second','\n'
    
        print 'Start training'
        prior_probability,conditional_probability = Train(train_features,train_labels)
        time_3 = time.time()
        print 'training cost ',time_3 - time_2,' second','\n'
    
        print 'Start predicting'
        test_predict = Predict(test_features,prior_probability,conditional_probability)
        time_4 = time.time()
        print 'predicting cost ',time_4 - time_3,' second','\n'
    
        score = accuracy_score(test_labels,test_predict)
        print "The accruacy socre is ", score
    

    【总结】

    1、贝叶斯决策理论方法是统计模型决策中的一个基本方法,基本思想:

    • 已知类条件概率密度参数表达式和先验概率
    • 利用贝叶斯公式转换成后验概率
    • 根据后验概率大小进行决策分类

    2、朴素贝叶斯法是典型的生成学习方法。
    3、学习联合概率分布P(X,Y),求得后验概率分布P(Y|X)。
    4、参数估计方法可以是极大似然估计和贝叶斯估计。
    5、朴素贝叶斯法的基本假设条件是条件独立性。
    6、后验概率最大等价于0-1损失函数时期望风险最小化。

    注:统计学习方法——修炼学习笔记系列参考学习资料:
    《统计学习方法》第2版 李航
    补充学习资料:
    https://www.jianshu.com/p/9a12fe2957db 李威威学习笔记
    https://blog.csdn.net/weixin_43374508/article/details/102784079 城序猿
    代码学习资料:https://github.com/WenDesi/lihang_book_algorithm

    相关文章

      网友评论

          本文标题:统计学习方法——修炼学习笔记4:朴素贝叶斯法

          本文链接:https://www.haomeiwen.com/subject/tpvkuhtx.html