机器学习之贝叶斯分类器---《机器学习-周志华》学习笔记

1. 解释先验概率、后验概率、全概率公式、条件概率公式,结合实例说明贝叶斯公式,如何理解贝叶斯定理?

①先验概率:是指根据以往经验和分析得到的概率

举个例子:如果我们对西瓜的色泽、根蒂和纹理等特征一无所知,按照常理来说,西瓜是好瓜的概率是60%。那么这个概率P(好瓜)就被称为先验概率。

②后验概率:事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小

举个例子:假如我们了解到判断西瓜是否好瓜的一个指标是纹理,把纹理清晰当作一种结果,然后去推测好瓜的概率,那么这个概率P(好瓜|纹理清晰)就被称为后验概率。

③全概率公式:

如果事件组 B 1 B_1 B1 B 2 B_2 B2,…满足
· B 1 B_1 B1 B 2 B_2 B2…两两互斥
· B 1 B_1 B1 B 2 B_2 B2…= Ω
则称事件组 B 1 B_1 B1 B 2 B_2 B2,…是样本空间Ω的一个划分;
B 1 B_1 B1 B 2 B_2 B2,…是样本空间Ω的一个划分,A为任一事件,则P(A)全概率公式为:
在这里插入图片描述
举个例子:上面联合概率概念买西瓜的例子中,我们要计算P(好瓜,纹理清晰)联合概率时,需要知道P(纹理清晰)的概率。那么,如何计算纹理清晰的概率呢?实际上可以分为两种情况:一种是好瓜状态下纹理清晰的概率,另一类是坏瓜状态下纹理清晰的概率。纹理清晰的概率就是这两种情况之和。因此,我们可以推导出全概率公式:
P(纹理清晰)=P(纹理清晰|好瓜)∙P(好瓜)+ P(纹理清晰|坏瓜)∙P(坏瓜)

④条件概率:设A,B是两个事件,且P(B)>0,则在事件B发生的条件下,事件A发生的条件概率

P ( A ∣ B ) = P ( A B ) / P ( B ) P(A|B)=P(AB)/P(B) P(AB)=P(AB)/P(B)
举个例子:已知一个西瓜是圆的,他是甜瓜的概率
P(甜|圆形)=P(又甜又圆)/P(圆形)

⑤贝叶斯公式:贝叶斯公式是建立在条件概率的基础上寻找事件发生的原因

在这里插入图片描述

2. 结合实例说明朴素贝叶斯分类器是如何对测试样本进行分类的?并归纳总结算法步骤

某个医院早上收了六个门诊病人,如下表截图

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大? 根据贝叶斯定理:
可得:
假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了:
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。 比较这几个概率,就可以知道他最可能得什么病。
构建朴素贝叶斯分类器的步骤如下:

1、根据训练样例分别计算每个类别出现的概率P(Ai),
2、对每个特征属性计算所有划分的条件概率P(Bi|Ai),
3、对每个类别计算P(B|Ai)*P(Ai),
4、选择3步骤中数值最大项作为B的类别Ak。

3. 分别说明如何用极大似然估计和贝叶斯估计进行朴素贝叶斯的参数估计

极大似然估计

假如有一个罐子,里面有黑白两种颜色的球,数目多少不知,两种颜色的比例也不知。我们想知道罐中白球和黑球的比例,但我们不能把罐中的球全部拿出来数。现在我们可以每次任意从已经摇匀的罐中拿一个球出来,记录球的颜色,然后把拿出来的球 再放回罐中。这个过程可以重复,我们可以用记录的球的颜色来估计罐中黑白球的比例。假如在前面的一百次重复记录中,有七十次是白球,请问罐中白球所占的比例最有可能是多少?
估计大家很快能反应出来答案是70%。但是如果让推导一下具体过程呢?
我们假设罐中白球的比例是p,那么黑球的比例就是1−p。因为每抽一个球出来,在记录颜色之后,我们把抽出的球放回了罐中并摇匀,所以每次抽出来的球的颜 色服从同一独立分布。这里我们把一次抽出来球的颜色称为一次抽样。题目中在一百次抽样中,七十次是白球的概率是p(x|θ),这里x是所有的抽样,θ是所给出的模型参数,表示每次抽出来的球是白色的概率为p。
先写出似然函数:

接下来对似然函数对数化:
然后求似然方程:
最后求解似然方程,得:p=0.7
贝叶斯估计

假如人们会感染一种病毒,有一种测试方法,在被测试者已感染这个病毒时,测试结果 为阳性的概率为95%。在被测试者没有感染这个病毒时,测试结果为阳性的概率为2%。现在,有一个人的测试结果为阳性,问这个人感染了病毒吗?
如果用最大似然估计的方法,既然感染了病毒出现阳性的概率为95%,没感染出现阳性的概率为2%,本着谁大像谁的原则,那我就认为这个人已经感染了病毒。
但是如果用贝叶斯方法进行估计,如果我们得知有一个先验概率,比如整体人群中只有1%的人会感染此种病毒,那么由贝叶斯公式:
在这里插入图片描述
其中,p(真阳性|检测为阳性)为后验概率,即我们通过检测出为阳性可以判断为真阳性的概率;
p(真阳性)为先验概率,
p(检测为阳性|真阳性)为条件概率,
p(真阳性)p(检测为阳性|真阳性)+p(真阴性)p(检测为阳性|真阴性)为全概率,检测出为阳性是由一个完备事件组构成的:这个人要么是真阳性,要么是真阴性。
由此可见,在贝叶斯估计中,先验概率对结果的影响很大。
在这种场景下,采用贝叶斯估计似乎更为合理一些。
最后来个总结:从本质上来说,最大似然是对点估计,贝叶斯推断是对分布估计。即,假设求解参数θ,最大似然是求出最有可能的θ值,而贝叶斯推断则是求解θ的分布。
原文:https://blog.csdn.net/bitcarmanlee/article/details/52201858

4. 编程实现拉普拉斯修正的朴素贝叶斯分类器,并以西瓜数据集3.0为例(P84),对P151的测试样本1进行判别。

import math
import numpy as np
import pandas as pd
 
D_keys = {
	'色泽': ['青绿', '乌黑', '浅白'], 
	'根蒂': ['蜷缩', '硬挺', '稍蜷'], 
	'敲声': ['清脆', '沉闷', '浊响'], 
	'纹理': ['稍糊', '模糊', '清晰'], 
	'脐部': ['凹陷', '稍凹', '平坦'], 
	'触感': ['软粘', '硬滑'], 
}
Class, labels = '好瓜', ['是', '否']
 
# 读取数据
def loadData(filename):
	dataSet = pd.read_csv(filename)
	dataSet.drop(columns=['编号'], inplace=True)
	return dataSet
 
# 配置测1数据
def load_data_test():
	array = ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460, '']
	dic = {a: b for a, b in zip(dataSet.columns, array)}
	return dic
 
def calculate_D(dataSet):
	D = []
	for label in labels:
		temp = dataSet.loc[dataSet[Class]==label]
		D.append(temp)
 
	return D
 
def calculate_Pc(Dc, D):
	D_size = D.shape[0]
	Dc_size = Dc.shape[0]
	N = len(labels)
	return (Dc_size+1) / (D_size+N)
 
def calculate_Pcx_D(key, value, Dc):
	Dc_size = Dc.shape[0]
	Dcx_size = Dc[key].value_counts()[value]
	Ni = len(D_keys[key])
	return (Dcx_size+1) / (Dc_size+Ni)
 
def calculate_Pcx_C(key, value, Dc):
	mean, var = Dc[key].mean(), Dc[key].var()
	exponent = math.exp(-(math.pow(value-mean, 2) / (2*var)))
	return (1 / (math.sqrt(2*math.pi*var)) * exponent)
 
def calculate_probability(label, Dc, dataSet, data_test):
	prob = calculate_Pc(Dc, dataSet)
	for key in Dc.columns[:-1]:
		value = data_test[key]
		if key in D_keys:
			prob *= calculate_Pcx_D(key, value, Dc)
		else:
			prob *= calculate_Pcx_C(key, value, Dc)
 
	return prob
 
def predict(dataSet, data_test):
	# mu, sigma = dataSet.mean(), dataSet.var()
	Dcs = calculate_D(dataSet)
	max_prob = -1
	for label, Dc in zip(labels, Dcs):
		prob = calculate_probability(label, Dc, dataSet, data_test)
 
		if prob > max_prob:
			best_label = label
			max_prob = prob
 
		print(label, prob)
 
	return best_label
 
 
if __name__ == '__main__':
	# 读取数据
	filename = 'data_3.txt'
	dataSet = loadData(filename)
	data_test = load_data_test()
	label = predict(dataSet, data_test)
	print('预测结果:', label)
原文:https://blog.csdn.net/weixin_37922777/article/details/89454697 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值