基础算法-朴素贝叶斯分类器
一、算法简介
1.1 背景
监督学习分为生成模型 (generative model) 与判别模型 (discriminative model),贝叶斯方法正是生成模型的代表 (还有隐马尔科夫模型)。
在概率论与统计学中,贝叶斯定理 (Bayes' theorem) 表达了一个事件发生的概率,而确定这一概率的方法是基于与该事件相关的条件先验知识 (prior knowledge)。而利用相应先验知识进行概率推断的过程为贝叶斯推断 (Bayesian inference)。
1.2 贝叶斯定理
条件概率 (conditional probability) 是指在事件 B 发生的情况下,事件 A 发生的概率。通常记为 P(A | B)。
因此
可得
由此可以推出贝叶斯公式
这也是条件概率的计算公式。
此外,由全概率公式,可得条件概率的另一种写法
其中样本空间由A和A'构成,由此求得事件B的概率。
1.3 贝叶斯推断
贝叶斯公式中,P(A)称为"先验概率"(Prior probability),即在B事件发生之前,对A事件概率的一个判断。
P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,对A事件概率的重新评估。
P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
所以,条件概率可以理解成下面的式子:后验概率=先验概率 x 调整因子
这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。因为在分类中,只需要找出可能性最大的那个选项,而不需要知道具体那个类别的概率是多少,所以为了减少计算量,全概率公式在实际编程中可以不使用。
而朴素贝叶斯推断,是在贝叶斯推断的基础上,对条件概率分布做了条件独立性的假设。因此可得朴素贝叶斯分类器的表达式。因为以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
1.4 朴素贝叶斯的参数推断
实际在机器学习的分类问题的应用中,朴素贝叶斯分类器的训练过程就是基于训练集 D 来估计类先验概率 P(c) ,并为每个属性估计条件概率 P(xi | c) 。这里就需要使用极大似然估计 (maximum likelihood estimation, 简称 MLE) 来估计相应的概率。
令 Dc 表示训练集 D 中的第 c 类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类别的先验概率:
对于离散属性而言,令 Dc,xi 表示 Dc 中在第 i 个属性上取值为 xi 的样本组成的集合,则条件概率 P(xi | c) 可估计为:
对于连续属性可考虑概率密度函数,假定
μ和sigma分别是第 c 类样本在第 i 个属性上取值的均值和方差,则有:
需注意,若某个属性值在训练集中没有与某个类同时出现过,为了避免,通常要进行“平滑”,拉普拉斯修正
1.5 算法流程
实际应用方式:
- 若任务对预测速度要求较高,则对给定的训练集,可将朴素贝叶斯分类器涉及的所有概率估值事先计算好存储起来,这样在进行预测时只需要 “查表” 即可进行判别;
- 若任务数据更替频繁,则可采用 “懒惰学习” (lazy learning) 方式,先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值;
- 若数据不断增加,则可在现有估值的基础上,仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现增量学习。
3.贝叶斯分类器代码
# 使用拉普拉斯修正的朴素贝叶斯分类器,这种情况是对第一行的数据进行测试
import numpy as np
import pandas as pd
from math import log, exp, pow, sqrt, pi# exp(x):e的x次方;pow(x,y):x的y次方
df = pd.read_csv('watermelon_4_3.csv')
data = df.values[:, 1:-1]
m, n = np.shape(data)
test = df.values[0, 1:-1]
labels = df.values[:, -1].tolist()
for i in range(len(labels)):if labels[i] == '否':labels[i] = 0else:labels[i] = 1# 第i个属性的可能取值
def class_number(index):class_number = {}for column in data:if column[index] not in class_number.keys():class_number[column[index]] = 0class_number[column[index]] += 1num = len(class_number)return num# 求出连续属性的均值和方差参数
def continue_para(num, index):ave = 0.0 # 求均值var = 0.0 # 求方差(此时没有开根号处理,套入公式抵消)count = 0for column in range(len(data)):if labels[column] == num:count += 1ave += data[column, index]ave = ave / count # 求均值for column in range(len(data)):if labels[column] == num:var += (data[column, index] - ave) * (data[column, index] - ave)var = var / count # 求方差return ave, var# 计算先验概率P
prob_good = log((8 + 1) / float(m + 2)) # P153
prob_bad = log((9 + 1) / float(m + 2)) # P153for i in range(len(data[0])):if type(test[i]).__name__ == 'float': # 当特征是连续的时候ave0, var0 = continue_para(0, i) # 0ave1, var1 = continue_para(1, i) # 1# 带入到连续的公式中prob0 = exp(- pow(test[i] - ave0, 2) / (2 * var0)) / sqrt(2 * pi * var0) # 连续属性0 坏瓜 P151prob1 = exp(- pow(test[i] - ave1, 2) / (2 * var1)) / sqrt(2 * pi * var1) # 连续属性1 好瓜 P151prob_bad += log(prob0)prob_good += log(prob1)# 离散else:count_good = 0count_bad = 0for column in range(len(data)):if test[i] == data[column, i]:if labels[column] == 1:count_good += 1if labels[column] == 0:count_bad += 1prob_good += log(float(count_good + 1) / (8 + class_number(i)))prob_bad += log(float(count_bad + 1) / (9 + class_number(i)))print('probability of good watermelon : %f' % prob_good)
print('probability of bad watermelon : %f' % prob_bad)
if prob_good >= prob_bad:print('final result: good watermelon (是)')
else:print('final result: bad watermelon (否)')
4.贝叶斯分类器面试题
基础算法-朴素贝叶斯分类器相关推荐
- 机器学习算法 - 朴素贝叶斯分类器
一.算法简介 1.1 背景 监督学习分为生成模型 (generative model) 与判别模型 (discriminative model) 判别模型:SVM, LR, KNN, NN, CR ...
- 0基础讲解机器学习算法-朴素贝叶斯分类器
朴素贝叶斯分类器可以说是最经典的基于统计的机器学习模型了.首先,暂且不管贝叶斯是什么意思,朴素这个名字放在分类器中好像有所深意. 一查,发现这个分类器的英文是"Naïve Bayes&quo ...
- Machine Learning | (5) Scikit-learn的分类器算法-朴素贝叶斯
Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...
- 面试前抢救一下--朴素贝叶斯分类器
写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...
- python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类
很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...
- python机器学习案例系列教程——文档分类器,朴素贝叶斯分类器,费舍尔分类器
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 github地址:https://github.com/626626cdllp/data-mining/tree/master/Bay ...
- 朴素贝叶斯分类器NBC
朴素贝叶斯分类器NBC 朴素贝叶斯算法是统计学的一种分类方法,利用概率统计知识进行分类.朴素贝叶斯一贝叶斯定理为基础,故统称为贝叶斯分类. ##贝叶斯流派 在提出贝叶斯方法之前,人们认为一件事发生的概 ...
- 机器学习算法——朴素贝叶斯(贝努利模型和多项式模型实现分类)
朴素贝叶斯算法 0.朴素贝叶斯是贝叶斯决策理论的一部分.之所以称之为"朴素",是因为整个形式化过程只做最原始.最简单的假设. 1.文本分类实例 2.朴素贝叶斯过滤垃圾邮件 3.使用 ...
- 《机器学习西瓜书》学习笔记——第七章_贝叶斯分类器_朴素贝叶斯分类器
朴素:特征条件独立:贝叶斯:基于贝叶斯定理. 朴素贝叶斯是经典的机器学习算法之一,也基于概率论的分类算法,属于监督学习的生成模型.朴素贝叶斯原理简单,也很容易实现,多用于文本分类,比如垃圾邮件过滤. ...
最新文章
- Java Web开发API Boy如何进阶?
- mysql 数据怎么导出_mysql怎么导出数据
- 解决xcode打开时假死的问题
- 【时间序列】NeuralProphet:Prophet的Pytorch实现!精度更高 预测更快 特性更多!...
- C语言查找单链列表的第k个元素的算法(附完整源码)
- MAC启动redis的目录
- Ubuntu 8.04下Netbeans的字体反锯齿解决(转)
- 激活函数之 Sigmoid、tanh、ReLU、ReLU变形和Maxout
- ARMA模型性质之平稳AR模型得统计性质
- 【转】远程桌面 剪切板复制文件失效解决方法
- 重磅签约!成都睿铂与成都航院共建数据处理联合实验室
- 企业运维经典面试题汇总(2)
- dateframe取某列数据_数据清洗amp;预处理入门完整指南
- matlab时域数据转频域,从时域和频域来解析傅里叶变换(含代码和性质)
- IP地址的分类及范围详解:A、B、C、D、E五类是如何划分的
- Atitit mvc之道 attilax著 1. Atitti mvc的几大概念	2 1.1. Dispatcher Controller	2 1.2. 声明式渲染	2 1.3. 条件与循环
- 慎用 Xmarks 多平台同步书签
- c 语言查询条件并列怎么用,关于C# if语句中并列条件的执行
- 微服务启动成功无法注册到服务注册中心
- 统计学学习日记:L6-离散趋势分析之总体方差和标准差