贝叶斯决策论及朴素贝叶斯分类器
文章目录
- 一、贝叶斯决策论
- 1.概率和统计
- 2.概率函数和似然函数
- 3.贝叶斯公式
- 4.贝叶斯决策论
- 5.极大似然估计(MLE)和最大后验概率估计(MAP)
- 二、朴素贝叶斯分类器
- 1. 简介
- 2.算法表示
- 3. 代码实现
一、贝叶斯决策论
1.概率和统计
(1)概率(probability):已知一个模型和对应参数,预测该模型产生的结果及特性(如均值,方差,协方差等),即数据;
(2)统计(statistics):根据已有数据预测出模型及对应参数;
可知概率和统计要研究的目的是相反的;
2.概率函数和似然函数
对于函数P(x∣θ)P\left( x|\theta \right)P(x∣θ),有两个输入,xxx表示某一个具体的数据,θ\thetaθ表示模型参数;那么有以下两种情况:
(1)xxx变化,θ\thetaθ固定的情况下,相当于模型及参数固定,给出不同的样本xxx,那么求出的是该xxx出现的概率是多少,此为概率函数;
(2)xxx固定,θ\thetaθ变化的情况下,求出的是对于不同的模型参数θ\thetaθ,出现x这个样本点的概率是多少,此为似然(likelihood)函数(可能性)。
3.贝叶斯公式
P(A∣B)=P(A)P(B∣A)P(B)P\left( A|B \right) =\frac{P\left( A \right)P\left( B|A \right) }{P\left( B \right)} P(A∣B)=P(B)P(A)P(B∣A)
贝叶斯公式中存在着一种事件发生的因果关系,若A是因,B是果,即A是导致B发生的原因之一; 那么:
- P(A∣B)P\left( A|B \right)P(A∣B)称为后验概率,是一种果因概率,即事件B已经发生后,是由A引起B发生的可能性有多大,可以理解为有多大把握能相信一件证据(或者说有多大的把握能确定是由A导致B发生的);
- P(A)P(A)P(A)称为先验(prior)概率,即能直接根据以往经验和分析得到的概率,如投一枚正常硬币,我们可以根据经验先验地知道正面朝上的概率是0.5;
- P(B∣A)P\left( B|A \right)P(B∣A)称为类条件概率(class-conditional probality),可以理解为如果AAA发生,那么接下来BBB发生的可能性有多大,如AAA=‘今天是五一’,BBB=‘今天放假’,则P(B∣A)=1P(B|A)=1P(B∣A)=1;或者称为似然。
- P(B)P(B)P(B)是用于归一化的“证据”因子,即导致BBB发生的所有可能性的集合,如BBB=‘今天放假’,那么P(B)P(B)P(B)就是所有可能导致今天放假的可能性的集合,如今天是周末或者是五一等,对于某一个事件BBB,通常P(B)是一个确定的值。
概率论与数理统计中关于全概率公式和贝叶斯公式中的解释:
- 从两个角度理解贝叶斯公式
(1)贝叶斯公式可化为:
P(A∣B)=P(A)P(B∣A)P(B∣A)P(A)+P(B∣∼A)P(∼A)P\left( A|B \right) =\frac{P\left( A \right) P\left( B|A \right)}{P\left( B|A \right) P\left( A \right) +P\left( B|\sim A \right) P\left( \sim A \right)}P(A∣B)=P(B∣A)P(A)+P(B∣∼A)P(∼A)P(A)P(B∣A)
如果我们想说“今天放假,那么今天是五一”这个命题为真该怎么做呢,可以想到,只要令上述贝叶斯公式分母中的P(B∣∼A)P(∼A)P\left( B|\sim A \right) P\left( \sim A \right)P(B∣∼A)P(∼A)为0即可,即排除掉引起放假的除五一外的其他可能因素;但是很明显,该命题为假,因为引起放假的因素不止五一节一种;
所以我们可以得出结论:做判断的时候,要考虑所有的因素。如今天放假,但是今天不一定是五一,更有可能是周末;
(2)从P(A)P(A)P(A)的角度考虑:我们假设AAA与BBB密切相关,取极端情况令P(B∣A)=1P(B|A)=1P(B∣A)=1,即若AAA发生,那么BBB一定发生;可是即使是这种情况,若P(A)P(A)P(A)太小,那么综合起来P(A∣B)P(A|B)P(A∣B)也会很小;如对于那些百万彩票,一旦有人中了那么他当时必定就成为了百万富翁;但是实际上所有百万富翁中只有非常少的人中过百万彩票;所以我们可以知道,就算某个因素和结果强烈相关,但是当这个因素发生的概率很低时,我们就要慎重考虑,要想想是不是其他因素造成的。
4.贝叶斯决策论
贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法,考虑基于已知的相关概率和误判损失来选择最优的类别标记。
假设有N种可能的类别标记,即y={c1,c2,...,cN}y=\left\{ c_1,c_2,...,c_N \right\}y={c1,c2,...,cN},λij\lambda _{ij}λij是将一个真实标记为cj{c_j}cj的样本xxx误分类为cic_ici所产生的期望损失(条件风险(conditional risk))
R(ci∣x)=∑j=1NλijP(cj∣x)R\left( c_i|x \right) =\sum_{j=1}^N{\lambda _{ij}P\left( c_j|x \right)} R(ci∣x)=j=1∑NλijP(cj∣x)
我们的目的是最小化条件风险,当
λij={0,ifi=j1,otherwise\lambda _{ij}=\begin{cases} 0, if\,\,i\,\,=\,\,j\\ 1, otherwise\\ \end{cases} λij={0,ifi=j1,otherwise
此时条件风险R(c∣x)=1−P(c∣x)R\left( c|x \right) =1-P\left( c|x \right)R(c∣x)=1−P(c∣x),最小化分类错误率的贝叶斯最优分类器为h∗(x)=argmaxc∈yP(c∣x)h^*\left( x \right) =\underset{c\in y}{arg\max}P\left( c|x \right)h∗(x)=c∈yargmaxP(c∣x)
即对每个样本xxx,选择能使后验概率P(c∣x)P(c|x)P(c∣x)最大的类别标记。方法有极大似然估计和最大后验概率估计。
(该部分来自于西瓜书)
5.极大似然估计(MLE)和最大后验概率估计(MAP)
二、朴素贝叶斯分类器
1. 简介
对于后验概率P(c|x),类条件概率P(x|c)是所有属性上的联合概率,属性间存在影响;为了简化问题,朴素贝叶斯分类器假设所有属性间相互独立,即每个属性独立地对分类结果有影响
2.算法表示
3. 代码实现
离散属性与连续属性的训练要区分对待
连续属性:
import numpy as np#鸢尾花,三个类别,每个类均有50个样本
import random
import math
def data_split(data):#将原数据划分成含有120个样本的训练集,含有30个样本的测试集data = data[1:]train_ratio = 0.8train_size = int(len(data) * train_ratio)random.shuffle(data)train_set = data[:train_size]test_set = data[train_size:]return train_set, test_setdef class_separate(data_set):#对数据进行处理,分类并统计separated_data = {}data_info = {}#表示的是各品种花所对应的数量for data in data_set:if data[-1] not in separated_data:#创建新字典索引,data和info两个字典都各自有三个索引,即花的品种separated_data[data[-1]] = []data_info[data[-1]] = 0separated_data[data[-1]].append(data)#将所有花分成三类,每种花都会被添加进对应的花类别中data_info[data[-1]] += 1if 'Species' in separated_data:del separated_data['Species']if 'Species' in data_info:del data_info['Species']return separated_data, data_infodef prior_prob(data, data_info):#计算每个类的先验概率data_prior_prob = {}data_sum = len(data)for cla, num in data_info.items():data_prior_prob[cla] = num / float(data_sum)return data_prior_probdef mean(data):#求均值data = [float(x) for x in data]#字符串转数字return sum(data) / len(data)def var(data):#求方差data = [float(x) for x in data]mean_data = mean(data)var = sum([math.pow((x - mean_data), 2) for x in data]) / float(len(data) - 1)return vardef prob_dense(x, mean, var):#由于是样本属性是连续值,所以要用概率密度exponent = math.exp(math.pow((float(x) - mean), 2) / (-2 * var))p = (1 / math.sqrt(2 * math.pi * var)) * exponentreturn pdef attribute_info(data):#分别计算出四个属性的均值和方差dataset = np.delete(data, -1, axis = 1) #删除标签result = [(mean(att), var(att)) for att in zip(*dataset)]#zip解开元组,生成四个属性的结果return resultdef summarize_class(data):data_separated, data_info = class_separate(data)summarizeClass = {}for index, x in data_separated.items():#三种类别对应4种属性,共12组,每组包含对应的均值和方差summarizeClass[index] = attribute_info(x)return summarizeClassdef cla_prob(test, summarizeClass):#此时summarizeClass就是三个类别的概率密度函数参数,即模型参数,test即测试数据(样本数据)prob = {}for cla, summary in summarizeClass.items():#cla类别,summary为该类对应的四个属性的(均值,方差)集合prob[cla] = 1for i in range(len(summary)):#属性个数mean, var = summary[i]x = test[i]p = prob_dense(x, mean, var)#计算离散属性值的条件概率prob[cla] *= p #连乘,最后得到这个类关于所有属性的条件概率return prob#获得条件概率def bayesian(input_data, data, data_info):#只需要考虑贝叶斯公式的分子,因为分母都是一样的,即只要考虑先验概率和条件概率priorProb = prior_prob(data, data_info)data_summary = summarize_class(data)classProb = cla_prob(input_data, data_summary)result = {}for cla, prob in classProb.items():# print(type(classProb))p = prob * priorProb[cla]result[cla] = preturn max(result, key=result.get)iris = np.array(np.loadtxt("IrisData.csv", dtype=str, delimiter=",")).tolist()##导入鸢尾花数据,共有150个样本,其中有四个属性,3个类别(0,1,2),每个类别都有50个样本
train_set, test_set = data_split(iris)
train_separated, train_info = class_separate(train_set)#获得分类好的数据和每个类别的样本数
correct = 0
for x in test_set:input_data = x[:-1]label = x[-1]result = bayesian(input_data, train_set, train_info)if result == label:correct += 1
print("precision:", correct / len(test_set))
训练结果:
贝叶斯决策论及朴素贝叶斯分类器相关推荐
- python机器学习案例系列教程——文档分类器,朴素贝叶斯分类器,费舍尔分类器
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 github地址:https://github.com/626626cdllp/data-mining/tree/master/Bay ...
- 机器学习实战 朴素贝叶斯分类器
基于概率论的分类方法: 朴素贝叶斯 我的微信公众号: s406205391; 欢迎大家一起学习,一起进步!!! k-近邻算法和决策树会给出"该数据属于哪一类"的明确回答.不过,分类 ...
- 【贝叶斯分类2】朴素贝叶斯分类器
文章目录 1. 贝叶斯决策论回顾 1.1 分类原理 1.2 贝叶斯分类器 1.3 P(c|x) 1.4 计算公式 1.5 极大似然估计 2. 朴素贝叶斯分类器学习笔记 2.1 引言 2.2 知识卡片 ...
- 机器学习:朴素贝叶斯分类器,决策函数向量化处理,mask使用技巧
文章目录 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 借助于numpy向量化处理,相当于并行计算,注意mask使用技巧,用途较广: 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 前面提到 ...
- 面试前抢救一下--朴素贝叶斯分类器
写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...
- 贝叶斯分类器_Sklearn 中的朴素贝叶斯分类器
(给Python开发者加星标,提升Python技能) 作者:Martin Müller,翻译:github-sisibeloved https://github.com/xitu/gold-miner ...
- sklearn朴素贝叶斯分类器_python机器学习:方法链和朴素贝叶斯分类器
今天我们在学习朴素贝叶斯分类器之前,我们先来总结下前面经常用到的内容,方法链:在scikit-learn中所有模型的fit方法返回的都是self.我们用一行代码初始化模型并拟合,对应代码如下:logr ...
- 机器学习实验 - 朴素贝叶斯分类器
目录 一.报告摘要 1.1 实验要求 1.2 实验思路 1.3 实验结论 二.实验内容 2.1 方法介绍 2.2 实验细节 2.2.1 实验环境 2.2.2 实验过程 2.2.3 实验与理论内容的不同 ...
- 朴素贝叶斯分类器NBC
朴素贝叶斯分类器NBC 朴素贝叶斯算法是统计学的一种分类方法,利用概率统计知识进行分类.朴素贝叶斯一贝叶斯定理为基础,故统称为贝叶斯分类. ##贝叶斯流派 在提出贝叶斯方法之前,人们认为一件事发生的概 ...
- 朴素贝叶斯分类器:例子解释
戳上面的蓝字关注我们! 作者:alg-flody 编辑:Emily 今日话题 在昨天推送了用一个例子引入贝叶斯公式的基本思想,然后用贝叶斯公式对一个很简单的问题做分类,最后引出来一个问题:后验概率 P ...
最新文章
- 精典的SQL语句(转)
- Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义
- python通信模块_基于Python的电路故障诊断系统通信模块的实现
- Linux基金会要“下田”了!开源技术在农业领域能做什么?
- PASCAL-VOC2012数据集(vocdevkit、Vocbenchmark_release)详细介绍
- ubuntu系统下VirtualBox安装windows虚拟机
- 计算机修改了服务如何恢复,怎么修复MSDTC服务?
- 游戏开发中一些常用的数学知识
- 万用表测试软件,最全的万用表使用方法看这里!
- 计算机无法关闭密码保护,win7的密码保护共享关闭不了怎么办_解决win7的密码保护共享关闭不了的方法...
- 关于xds100仿真器的ftdi驱动无法使用的问题
- Unity—手机端的触屏控制
- “云”到底是什么?云计算7种类型细分
- 网络表示学习Network Representation Learning/Embedding
- vscode修改PHP注释
- 购物卡逻辑思维导图整理
- `符号在sql中的作用
- 用户运营之push和短信
- ORA01007 INS32018
- 量化私募江湖录:多少家?猜猜看?
热门文章
- php区块链开发游戏,php程序员如何开发区块链、以太坊、智能合约的教程
- poEdit制作WordPress主题汉化,插件汉化攻略
- 社招腾讯,阿里,京东,必问知识点整理,常考知识点全在这里了!
- c51汇编语言如何定义全局变量_汇编语言程序访问C语言全局变量
- Windows如何对硬盘进行分区?
- 在浏览器中播放m3u8
- SC_FDE仿真平台:卷积编码 -> 矩阵交织 -> QPSK调制 -> 插入导频 -> 插入CP -> RayleighFading->channel
- JAVA打包成EXE文件,能在没有jre环境的电脑上运行
- mariadb 的安装及基本配置
- 倍福TwinCAT 3 气缸动作程序编写