文章目录

  • 1.朴素贝叶斯的基本方法
  • 2.朴素贝叶斯的参数估计
    • 1.极大似然估计
    • 2.朴素贝叶斯算法
    • 3.贝叶斯估计
  • 3.后验概率最大化-期望风险最小化
  • 4.朴素贝叶斯代码实现

1.朴素贝叶斯的基本方法

2.朴素贝叶斯的参数估计

1.极大似然估计


2.朴素贝叶斯算法



3.贝叶斯估计

用极大似然估计可能出现所要估计的概率值为0的情况,这是会影响到后验概率的计算结果,使分类产生偏差。解决这一问题的方法就是采用贝叶斯估计,原理是在分子、分母中加上指定数值,使得不同项之间大小关系不变,,但消除了分母为0的可能性



3.后验概率最大化-期望风险最小化


4.朴素贝叶斯代码实现

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: natives.py
@time: 2020/10/21 17:18
"""
import time
import numpy as np
from tqdm import tqdmdef loaddata(filename):"""加载数据集:param filename: 文件路径:return: 数据与标签"""# 存放数据及标签dataArr = []labelArr = []# 读取文件fr = open(filename)# 遍历读取文件每一行for line in tqdm(fr.readlines()):# 获取当前行,并按','进行切割,返回列表curLine = line.strip().split(',')# 获取数据# 将数据进行了二值化处理,大于128的转换成1,小于的转换成0,方便后续计算dataArr.append([int(int(num) > 128) for num in curLine[1:]])# 获取标签labelArr.append(int(curLine[0]))# 返回数据集与标签return dataArr, labelArrdef NaivesBayes(Py, Px_y, x):"""通过贝叶斯进行概率估计:param Py: 先验概率分布:param Px_y: 条件概率分布:param x: 要估计的样本:return: 返回所有label的估计概率"""# 设置特征数目featureNum = 784# 设置类别数目classNum = 10# 建立存放所有标记的概率的数组P = [0] * classNum# 对于每一个类别,单独估计其概率for i in range(classNum):# 初始化sum为0,sum为求和项。# 在训练过程中对概率进行了log处理,所以这里原先应当是连乘所有概率,最后比较哪个概率最大# 但是当使用log处理时,连乘变成了累加,所以使用sumsum = 0# 获取某一个类别的某个特征的概率,进行累加for j in range(featureNum):# x[j] = 0或1sum += Px_y[i][j][x[j]]# 最后再和先验概率相加(也就是式4.7中的先验概率乘以后头那些东西,乘法因为log全变成了加法)P[i] = sum + Py[i]# 返回该概率最大值对应的索引,即为分类return P.index(max(P))def model_test(Py, Px_y, testDataArr, testLabelArr):"""对数据集进行测试:param Py: 先验概率:param Px_y: 条件概率:param testDataArr:测试数据集:param testLabelArr: 测试数据标签:return: 返回正确率"""# 错误值计数errorCnt = 0# 遍历测试集的每一个样本for i in tqdm(range(len(testDataArr))):# 获取预测值predict = NaivesBayes(Py, Px_y, testDataArr[i])# 如果预测值不等于标志,则errorCnt + 1if predict != testLabelArr[i]:errorCnt += 1# 返回准确率return 1 - (errorCnt / len(testDataArr))def getAllProbability(trainDataArr, trainLabelArr):"""通过训练集获得先验概率与条件概率:param trainDataArr: 训练数据集:param trainLabelArr: 训练数据集标签:return: 返回先验概率与条件概率"""# 设置特征数目featureNum = 784# 设置类别数目labelNum = 10# 初始化先验概率存放数组Py = np.zeros((labelNum, 1))# 对每个类别进行一次循环,分别计算它们的先验概率分布for i in range(labelNum):# np.mat(trainLabelArr) == i:将标签转换为矩阵形式,里面的每一位与i比较,若相等,该位变为Ture,反之False# np.sum(np.mat(trainLabelArr) == i):计算上一步得到的矩阵中Ture的个数,进行求和(直观上就是找所有label中有多少个# 为i的标记,求得4.8式P(Y = Ck)中的分子)# 贝叶斯估计:分子加1,分母加上K(K为标签可取的值数量,这里有10个数,取值为10)Py[i] = (np.sum(np.mat(trainLabelArr) == True) + 1) / (len(trainLabelArr) + 10)# 转为log形式,防止下溢出Py = np.log(Py)# 计算条件概率 Px_y=P(X=x|Y = y)# 计算条件概率分成了两个步骤,下方第一个大for循环用于累加,参考书中“4.2.3 贝叶斯估计 式4.10”,下方第一个大for循环内部是# 用于计算式4.10的分子,至于分子的+1以及分母的计算在下方第二个大For内# 初始化为全0矩阵,用于存放所有情况下的条件概率,xj只有0和1Px_y = np.zeros((labelNum, featureNum, 2))# 对标记集进行遍历for i in range(len(trainLabelArr)):# 获取当前循环所使用的标记label = trainLabelArr[i]# 获取当前要处理的样本x = trainDataArr[i]# 对该样本的每一维特诊进行遍历for j in range(featureNum):# 在矩阵中对应位置加1# 这里还没有计算条件概率,先把所有数累加,全加完以后,在后续步骤中再求对应的条件概率Px_y[label][j][int(x[j])] += 1# 第二个大for循环,计算式4.10的分母,以及分子和分母之间的除法# 循环每一个标记for label in range(labelNum):# 循环每一个标记对应的每一个特征for j in range(featureNum):# 获取y=label,第j个特诊为0的个数Px_y0 = Px_y[label][j][0]# 获取y=label,第j个特诊为1的个数Px_y1 = Px_y[label][j][1]# 对式4.10的分子和分母进行相除,再除之前依据贝叶斯估计,分母需要加上2(为每个特征可取值个数)# 分别计算对于y= label,x第j个特征为0和1的条件概率分布Px_y[label][j][0] = np.log((Px_y0 + 1) / (Px_y0 + Px_y1 + 2))Px_y[label][j][1] = np.log((Px_y1 + 1) / (Px_y0 + Px_y1 + 2))return Py, Px_yif __name__ == '__main__':start = time.time()# 读取数据集print('start to read trainSet')trainDataArr, trainLabelArr = loaddata('data/mnist_train.csv')print('start to read testSet')testDataArr, testLabelArr = loaddata('data/mnist_test.csv')# 开始训练,学习先验概率与条件概率分布print('start to train')Py, Px_y = getAllProbability(trainDataArr, trainLabelArr)# 使用习得的先验概率与条件概率分布,开始测试print('start to test')accuracy = model_test(Py, Px_y, testDataArr, testLabelArr)# 打印准确率print('accuracy = ', accuracy)# 打印时间end = time.time()print('time=', end - start)
start to read trainSet
100%|██████████| 60000/60000 [00:17<00:00, 3379.31it/s]
start to read testSet
100%|██████████| 10000/10000 [00:02<00:00, 3418.50it/s]
start to train
start to test
100%|██████████| 10000/10000 [00:41<00:00, 242.28it/s]
accuracy =  0.8435
time= 102.47366952896118

统计学习方法读书笔记8-朴素贝叶斯相关推荐

  1. 机器学习实战读书笔记(3)朴素贝叶斯

    贝叶斯定理 要理解贝叶斯推断,必须先理解贝叶斯定理.后者实际上就是计算"条件概率"的公式. 所谓"条件概率"(Conditional probability), ...

  2. 统计学习方法第四章朴素贝叶斯法-李航

    第4章 朴素贝叶斯法 朴素贝叶斯 (naive Bayes) 法是基于贝叶斯定理与特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型 ...

  3. 机器学习实战 - 读书笔记(04) - 朴素贝叶斯

    核心公式 - 贝叶斯准则 \[p(c|x) = \frac{p(x|c)p(c)}{p(x)}\] p(c|x) 是在x发生的情况下,c发生的概率. p(x|c) 是在c发生的情况下,x发生的概率. ...

  4. 统计学习方法读书笔记(六)-逻辑斯蒂回归与最大熵模型(迭代尺度法(IIS))

    全部笔记的汇总贴:统计学习方法读书笔记汇总贴 逻辑斯谛回归 (logistic regression )是统计学习中的经典分类方法.最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型(m ...

  5. 统计学习方法读书笔记(九)-EM算法及其推广

    全部笔记的汇总贴:统计学习方法读书笔记汇总贴 EM算法用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计.EM算法的每次迭代由两步组成:E步,求期望(ex ...

  6. 统计学习方法笔记(三)-朴素贝叶斯原理及python实现

    朴素贝叶斯 条件概率 特征条件独立假设 朴素贝叶分类器 朴素贝叶斯分类算法原理 学习与分类算法 朴素贝叶斯算法原理 模型 多项式模型 高斯模型 伯努利模型 多项式模型的朴素贝叶斯分类器实现代码 高斯模 ...

  7. 机器学习读书笔记之6 - 贝叶斯系列

    概率论只不过是把常识用数学公式表达了出来. --拉普拉斯 目录 0. 前言  1. 历史      1.1 一个例子:自然语言的二义性      1.2 贝叶斯公式  2. 拼写纠正  3. 模型比较 ...

  8. 机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现

    本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序.1 方法概 ...

  9. 【机器学习笔记】朴素贝叶斯

    本文学习自 https://zhuanlan.zhihu.com/ml-jack 朴素贝叶斯 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题. 1.贝叶斯决策理论 贝叶斯决策理论的核心思想:选择具 ...

  10. 机器学习笔记 - 学习朴素贝叶斯概念及应用

    一.思想概述         贝叶斯分类算法是一大类分类算法的总称:贝叶斯分类算法以样本可能属于某类的概率来作为分类依据:朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种. 朴素贝叶斯分类器是一种用于 ...

最新文章

  1. Java 发送QQ邮箱邮件
  2. Hibernate.Annotation注解
  3. docker 守护进程
  4. 晨哥真有料丨明知道没有结果的爱情,还要继续下去吗?
  5. oc中该使用lock还是gcd/syncronize
  6. Nacos实现环境隔离
  7. 6000万条GitHub帖子告诉你:工作状态与表情符号强相关
  8. Linux系统里存在两个剪切板
  9. 编写可维护的 JavaScript
  10. python实现移除某文件夹下所有文件
  11. python与vfp做桌面数据库_Python:如何提高将数据从vfp(dbf)加载到oracle的效率?...
  12. 手把手教你写上位机软件(c#、winform)
  13. 美国大学网址大全(按州排序)
  14. MATLAB中的pause用法,pause使用方法 C语言 pause()函数问题
  15. 流媒体直播点播系统方案设计
  16. Fiddler替换HTTP Request Host
  17. 【数学基础】直线点法式方程表达
  18. 使用TASSEL学习GWAS笔记(3/6):基因型数据可视化:kingship,PCA,MDS
  19. Spring嵌入式数据库示例
  20. 老师给的硬核移动端测试面试题目,大家看看靠谱吗

热门文章

  1. 将应用程序11M内存占用,降至500K左右
  2. 普通开发人员与软件工程师的区别
  3. vue day8 table page
  4. vue-i18n使用ES6语法以及空格换行问题
  5. ps图层组快捷键 一次打开或关闭所有的顶级图层组
  6. nginx编译包含perl模块
  7. 关于中断和异常的几点认识
  8. HTML其他常用标签
  9. Android 服务
  10. Selenium Chrome浏览器的启动以及proxy设置