朴素贝叶斯算法的原理:

朴素贝叶斯算法的原理:

1. 朴素贝叶斯法是典型的生成学习方法。

生成方法由训练数据学习联合概率分布P(X,Y),然后求得后验概率分布P(Y|X)。具体来说,利用训练数据学习P(XY)和P(Y)的估计,得到联合概率分布:P(X,Y)=P(Y)P(X|Y)概率估计方法可以是极大似然估计或贝叶斯估计。

2.朴素贝叶斯法的基本假设是条件独立性
在这里插入图片描述

这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。

3.朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。

在这里插入图片描述

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

在这里插入图片描述

通俗版:其实就是把样本X的每个维度看成独立的,还是比如一个人的脸的眼睛啊,鼻子啊,嘴巴啊,通过训练集计算哪种种类的人(Y)的对应的眼睛大的概率是多少,眼睛小的概率是多少,根据训练集先计算出各个条件概率(即黑种人的眼睛大的概率是多少)的值和(黑种人,黄种人等各自的占所有训练集人数的概率比)先验概率,然后再输入一个测试集样本(眼睛大鼻子小嘴巴大),我们就计算不同标签下符合输入样本特征的总概率(黑种人\黄种人等 眼睛大鼻子小嘴巴大的概率),哪个概率最大标签就是哪个。

案例分享:

import pandas as pd
import numpy as np
import cv2
import random
import time

from sklearn.model_selection 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.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(len(img)):

            conditional_probability[label][j][img[j]]+=1
		############	
		

    for i in range(class_num):
        for j in range(feature_len):
            conditional_probability[i][j][0]=(conditional_probability[i][j][0]+1)/(prior_probability[i]+2)
            conditional_probability[i][j][1] = (conditional_probability[i][j][1]+1) / (prior_probability[i]+2)#拉普拉斯平滑

        prior_probability[i]=(prior_probability[i]+1)/(len(train_labels)+10)#拉普拉斯平滑
    ##########
		#填写代码

		
		############	

    return prior_probability,conditional_probability

# 计算概率
def calculate_probability(img,label,prior_probability,conditional_probability):

	##########
	#填写代码
    img1=img
    j=label
    probability=prior_probability[j]
    for i in range(len(img1)):
        probability=probability*conditional_probability[j][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,prior_probability,conditional_probability)

        for j in range(1,10):
            probability = calculate_probability(img,j,prior_probability,conditional_probability)

            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('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[0:4000], labels[0:4000], 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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值