机器学习算法 - 朴素贝叶斯分类器
一、算法简介
1.1 背景
监督学习分为生成模型 (generative model) 与判别模型 (discriminative model)
判别模型:SVM, LR, KNN, NN, CRF等
生成模型:贝叶斯方法(Naive Bayes), 隐马尔科夫模型(HMM), LDA等
在概率论与统计学中,贝叶斯定理 (Bayes’ theorem) 表达了一个事件发生的概率,而确定这一概率的方法是基于与该事件相关的条件先验知识 (prior knowledge)。而利用相应先验知识进行概率推断的过程为贝叶斯推断 (Bayesian inference)。
分类问题被划分成了两个阶段:推断inference阶段和决策decision阶段
- 推断阶段:使用训练数据学习后验概率
- 决策阶段:使用这些后验概率来进行最优的分类
估计后验概率主要有两种策略:
判别式模型(discriminative models):直接对类后验概率p(c|x)进行推断
生成式模型(generative models):对类条件概率P(x|c)和先验概率P©进行推断。
其中
P( c )是类“先验”(prior)概率;
P(x|c)是样本x相对于类标记c的类条件概率(class-conditional probability),或称为“似然”(likelihood);
P(x)是用于归一化的“证据”(evidence)因子。
对给定样本x,证据因子P(x)与类标记无关,因此估计P(c|x) 的问题就转化为如何基于训练数据D来估计先验P( c )和似然P(x|c)。
类先验概率P( c ) 表达了样本空间中各类样本所占的比例。根据大数定律,当训练集包含充足的独立同分布样本时, P( c ) 可通过各类样本出现的频率来进行估计。
对类条件概率P(x|c) 来说,由于它涉及关于x 所有属性的联合概率,直接根据样本出现的频率来估计将会遇到严重的困难。例如,假设样本的d个属性都是二值的,则样本空间将有2d2^d2d种可能的取值,在现实应用中,这个值往往远大于训练样本数m,也就是说,很多样本取值在训练集中根本没有出现,直接使用频率来估计P(x|c)显然不可行,因为"未被观测到"与"出现概率为零"通常是不同的。
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) 方式,先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值;
- 若数据不断增加,则可在现有估值的基础上,仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现增量学习。
二、贝叶斯分类器代码
# 使用拉普拉斯修正的朴素贝叶斯分类器,这种情况是对第一行的数据进行测试
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 (否)')
机器学习算法 - 朴素贝叶斯分类器相关推荐
- 0基础讲解机器学习算法-朴素贝叶斯分类器
朴素贝叶斯分类器可以说是最经典的基于统计的机器学习模型了.首先,暂且不管贝叶斯是什么意思,朴素这个名字放在分类器中好像有所深意. 一查,发现这个分类器的英文是"Naïve Bayes&quo ...
- 【机器学习算法-朴素贝叶斯、支持向量机】
机器学习算法-朴素贝叶斯算法 1.朴素贝叶斯算法 2.支持向量机 2.1SVM基本综述 1.朴素贝叶斯算法 朴素贝叶斯是生成模型,需要根据已有的数据求出先验概率. 1.联合概率 2.条件概率 3.相互 ...
- 机器学习实验 - 朴素贝叶斯分类器
目录 一.报告摘要 1.1 实验要求 1.2 实验思路 1.3 实验结论 二.实验内容 2.1 方法介绍 2.2 实验细节 2.2.1 实验环境 2.2.2 实验过程 2.2.3 实验与理论内容的不同 ...
- 机器学习算法——朴素贝叶斯(贝努利模型和多项式模型实现分类)
朴素贝叶斯算法 0.朴素贝叶斯是贝叶斯决策理论的一部分.之所以称之为"朴素",是因为整个形式化过程只做最原始.最简单的假设. 1.文本分类实例 2.朴素贝叶斯过滤垃圾邮件 3.使用 ...
- 机器学习实战 朴素贝叶斯分类器
基于概率论的分类方法: 朴素贝叶斯 我的微信公众号: s406205391; 欢迎大家一起学习,一起进步!!! k-近邻算法和决策树会给出"该数据属于哪一类"的明确回答.不过,分类 ...
- 基础算法-朴素贝叶斯分类器
一.算法简介 1.1 背景 监督学习分为生成模型 (generative model) 与判别模型 (discriminative model),贝叶斯方法正是生成模型的代表 (还有隐马尔科夫模型). ...
- a*算法的优缺点_轻松理解机器学习算法-朴素贝叶斯
1.预备知识 贝叶斯定理(Bayes' theorem)是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关.通常事件A在事件B发生的条件下的概率,与事件B在事件A发生的条件下的概率是不一 ...
- 机器学习:朴素贝叶斯分类器,决策函数向量化处理,mask使用技巧
文章目录 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 借助于numpy向量化处理,相当于并行计算,注意mask使用技巧,用途较广: 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 前面提到 ...
- 机器学习算法-朴素贝叶斯
一.概述 概率分类器 在许多分类算法应用中,特征和标签之间的关系并非是决定性的.比如说,我们想预测一个人究竟是否会在泰坦尼克号海难中生存下来,那我们可以建一棵决策树来学习我们的训练集.在训练中,其中一 ...
最新文章
- 机器学习面试必备 CheatSheet
- koa中间件mysql写法_koa-mysql(三)
- Sentinel(十九)之主流框架的适配
- 玩JerseyTest(Jersey 2.5.1和DI)
- 十大经典排序算法动画与解析(配代码完全版)
- 在私企里,男工人能工作到退休年龄60岁吗?
- LeetCode 153. 寻找旋转排序数组中的最小值(二分)
- 前端存储 (2) - sessionStorage ,localStorage
- Windows下Mysql定时备份的实现
- [CF559C]Gerald and Giant Chess
- 基于微信小程序点餐系统的设计与实现(含word论文)
- jq 获取引入页面url_jQuery获取当前页面的URL信息
- win7下安装MySQL的步骤
- 鲸探发布点评:7月12日发售小王子系列数字藏品
- Android常用颜色对照表
- GoogleCode中git push密码错误提示解决方案(Invalid username/password)
- nolo手柄配对不上_用NOLOHOME玩电脑VR游戏-支持键鼠和游戏手柄
- laravel表单提交419解决办法
- 总结HTTP协议详解
- 使用w3c生成xml文件