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

一、朴素贝叶斯法

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
对于给定数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型对给定输入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

分母对所有都有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:朴素贝叶斯法)