机器学习——朴素贝叶斯

目录

简介

一、基于贝叶斯决策理论的分类方法

条件概率

全概率公式

贝叶斯公式

贝叶斯推断

二、python实现

数据集

导包

读取数据

数据预处理

测试

测试结果


简介

朴素贝叶斯(Naive Bayes)是一种基于概率统计和特征条件独立性假设的机器学习算法,常用于分类和文本分类任务。它的名字来源于贝叶斯定理,该定理描述了在已知先验概率的情况下,如何根据新的观察结果来更新概率。 朴素贝叶斯算法的核心思想是假设每个特征之间相互独立,即使在实际情况中这种假设并不一定成立。尽管这个假设相对简单,但在许多实际应用中,朴素贝叶斯表现良好,并且通常具有较快的训练速度和良好的泛化能力。 在分类任务中,朴素贝叶斯算法根据特征的出现概率来计算每个类别的概率,并选择具有最高概率的类别作为预测结果。在文本分类中,朴素贝叶斯经常被用来进行垃圾邮件过滤、情感分析等任务。

总的来说,朴素贝叶斯算法是一种简单而有效的分类算法,尤其适用于特征之间相对独立且特征维度较高的情况。

一、基于贝叶斯决策理论的分类方法

基于贝叶斯决策理论的分类方法是一种基于概率统计的分类方法,它利用贝叶斯定理来进行分类决策。这个方法的核心思想是在给定特征条件下,计算每个类别的后验概率,并选择具有最高后验概率的类别作为最终的分类结果。

具体来说,基于贝叶斯决策理论的分类方法包括以下几个步骤:

1. **计算先验概率**:先验概率指的是在未观察到任何特征信息时,每个类别的概率。可以通过统计训练数据集中每个类别的样本数量来计算。

2. **计算类条件概率**:类条件概率指的是在给定类别下,观察到某个特征的概率。可以通过统计每个类别下每个特征的出现频率来计算。

3. **应用贝叶斯定理计算后验概率**:根据贝叶斯定理,后验概率可以通过先验概率和类条件概率计算得到。对于给定的特征向量,计算每个类别的后验概率。

4. **选择最可能的类别**:根据计算得到的后验概率,选择具有最高后验概率的类别作为最终的分类结果。

基于贝叶斯决策理论的分类方法在实际应用中有很多变种和扩展,如朴素贝叶斯分类器、贝叶斯网络等。这些方法在处理分类问题时通常具有较好的鲁棒性和泛化能力,尤其适用于特征维度较高的情况下。

条件概率

贝叶斯条件概率是概率论中的一个重要概念,它是在贝叶斯定理的框架下定义的。贝叶斯定理提供了一种在已知某些条件下更新事件发生概率的方法。具体来说,它量化了在观察到某些数据或证据后,一个事件发生的概率如何变化。

条件概率通常定义为在事件B发生的条件下事件A发生的概率,记作P(A|B)。贝叶斯条件概率则是从另一个角度来考虑这个问题,它是在已知事件B发生的条件下事件A发生的概率。根据贝叶斯定理,这个概率可以通过以下公式计算:

P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}

其中:

P(A|B) 是事件A在事件B发生的条件下发生的概率,即贝叶斯条件概率。
P(B|A) 是事件A发生的条件下事件B发生的概率。
P(A) 是事件A发生的“先验概率”,即在没有考虑任何其他信息时事件A发生的概率。
P(B) 是事件B发生的“边缘概率”,即在没有考虑任何其他信息时事件B发生的概率。

在实际应用中,贝叶斯条件概率的计算通常涉及到对数据集的统计分析,以及对模型参数的估计。这个概念在机器学习、统计学、数据科学以及许多其他领域都有广泛的应用,特别是在需要根据观测数据来估计未知参数或进行决策的情况下。

全概率公式

全概率公式(Law of Total Probability)是概率论中的一个基本定理,它描述了一个事件的总概率是如何由其在一组互斥且完备事件上的条件概率加权得到的。全概率公式在贝叶斯推断中具有重要的作用。

假设B_1, B_2, ..., B_n 是一组互斥且完备事件(即它们两两不相交,并且它们的并集构成了整个样本空间),且  A  是另一个事件,则全概率公式表示为:

P(A) = \sum_{i=1}^{n} P(A|B_i) \cdot P(B_i)

其中:
P(A) 是事件 A 的概率,即所求的总概率。
P(A|B_i) 是给定事件 B_i 发生的条件下事件 A  发生的概率,即条件概率。
P(B_i) 是事件 B_i 的概率,即每个条件的先验概率。
求和符号  sum 表示对所有可能的事件 B_i 进行求和。

全概率公式的直观理解是,事件 A 的总概率等于在所有可能的条件下事件  A 发生的概率的加权和,其中权重是各个条件的先验概率。

全概率公式在贝叶斯定理中的应用是,当我们无法直接计算事件 A 的概率时,可以通过将样本空间分解成一组互斥且完备的事件,计算每个事件下的条件概率,并利用全概率公式来求解事件 A 的概率。

贝叶斯公式

贝叶斯公式(Bayes' theorem)是概率论中的一个基本定理,它描述了在给定一些先验知识的情况下,如何更新我们对某个事件的信念。这个公式以托马斯·贝叶斯的名字命名,但其最早的形式由皮埃尔-西蒙·拉普拉斯提出。

贝叶斯公式表示如下:

P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}

其中:
P(A|B) 是在事件 B 发生的条件下事件 A  发生的概率,称为后验概率。
P(B|A) 是在事件 A 发生的条件下事件  B 发生的概率,称为似然度。
P(A) 是事件 A 的先验概率,即在考虑任何观察之前事件 A  发生的概率。
P(B) 是事件 B 的边缘概率,即在考虑任何观察之前事件 B  发生的概率。

贝叶斯公式的关键在于它能够通过已知的信息来更新我们对事件的信念,即从先验概率 P(A) 更新为后验概率 P(A|B) 。这种更新是通过考虑观察到的数据 B  对事件 A 的影响而进行的。

贝叶斯公式在统计学、机器学习、人工智能等领域有着广泛的应用,特别是在贝叶斯推断和贝叶斯统计中。它提供了一种理论框架,用于从数据中进行推断、预测和决策,尤其在面对不确定性和有限数据时具有重要作用。

贝叶斯推断

贝叶斯推断是一种从数据中推断模型参数或未知变量的方法,它基于贝叶斯定理进行推断。贝叶斯推断能够处理不确定性,并提供了一种灵活的框架来更新对未知量的信念,结合观察到的数据。

贝叶斯推断的核心思想是将观察到的数据(观测值)与先验知识(关于未知量的初始信念)结合起来,通过贝叶斯定理计算后验概率分布。这个后验概率分布反映了在考虑观测到的数据后,未知量的可能取值的相对可能性。

具体来说,贝叶斯推断包括以下步骤:

1. **建立模型**:确定模型结构和参数,并假设先验分布来描述模型参数的不确定性。

2. **观测数据**:观测到数据或样本。

3. **计算后验概率**:利用贝叶斯定理,将先验分布与观测数据结合起来,计算后验概率分布。

4. **进行推断**:根据后验概率分布,对未知量进行推断,例如计算期望值、最大后验估计或者分析后验概率的置信区间。

5. **更新**:如果有新的观测数据,可以使用已有的后验概率分布作为新的先验分布,进行进一步的更新。

贝叶斯推断在许多领域中都有广泛的应用,特别是在机器学习、统计学、人工智能和生物学等领域。它能够有效地利用先验知识和观测数据,进行参数估计、模型选择、预测和决策等任务,尤其在样本量较小或者不确定性较高的情况下表现出色。

二、python实现

数据集

有以下数据集,来记录15个西瓜的特征,

其中,特征变量x1表示西瓜的某个特征,比如颜色特征:1表示青绿;2表示乌黑;3表示浅白;

特征变量x2用字符串表示西瓜的尺寸特征,'S’表示小,'M’表示中等,'L’表示大个;y表示西瓜的品质标签,1表示好瓜,-1表示坏瓜。
在这里插入图片描述

类先验概率(CPP)

类先验概率(Class Prior Probability,CPP)是指在分类问题中,每个类别的概率。在监督学习中,类先验概率通常由大量未标记的数据来估计。在贝叶斯分类器中,类先验概率用于计算每个类别的后验概率,进而用于决策。

在多类别分类问题中,每个类别都有其相应的类先验概率。这些概率反映了在训练数据集中每个类别出现的频率或可能性。类先验概率在许多机器学习算法中都扮演着重要角色,如决策树、支持向量机(SVM)和神经网络等。

值得注意的是,类先验概率是主观的,因为它们通常由人类根据经验和知识来设定。然而,机器学习算法可以自动从数据中学习类先验概率,这在某些情况下可能比人类设定的值更加准确和有效。

我们可以通过(统计)计数的方法,来获得类先验P ( c ) P(c)P(c)的概率分布如下:


从中可以,看出,好瓜类的比例是0.6,坏瓜类的比例是0.4。这个表其实就是类先验概率分布表ClassPriorProbability(CPP)。

预测先验概率(PPP)

"预测先验概率"(Predictive Prior Probability,PPP)这个术语并不是一个标准的统计学术语。在概率论和统计学中,我们通常讨论的是“先验概率”(Prior Probability)和“预测概率”(Predictive Probability)两个概念。

先验概率是指在考虑任何具体的样本或数据之前,我们对一个假设或事件的概率估计。它反映了我们在没有考虑任何其他信息之前对某个事件发生的信念程度。

预测概率,又称为后验概率,是指在观察到样本数据之后,我们对某个假设或事件的概率估计。它结合了先验概率和似然概率(即样本数据出现的概率),通过贝叶斯定理来计算。

如果您是在引用某个特定的文献或上下文中的“预测先验概率”,那么可能需要具体的文献或领域知识来准确解释这个术语。在一般的情况下,我们可以将“预测先验概率”理解为在预测分析中对先验概率的应用,这可能涉及到对模型或预测器的先验信念和信息的整合。

如果您能提供更多关于“预测先验概率”的使用情境或上下文,我将能够提供更精确的解释。
 

同样的,我们也可以对x1/x2特征进行统计,得到预测子先验概率分布Predictor Prior Probability(PPP)如下:
在这里插入图片描述在这里插入图片描述

从三、四两小节可以看到,先验概率其实是就是概率分布,只不过频率学派是基于大数据统计的,而贝叶斯学派是基于知识假设或者主观的。

后验概率(Posterior Probablity)

后验概率其实就是我们最终的目标,也就是根据看到的特征来预测分类。我们可以通过以下的python代码来写一个NaiveBayes的类(class),训练给定的数据之后得到概率分布,然后用来进行预测。

基于简单的西瓜数据集,使用Bayes分类器对西瓜进行分类,直接上代码,具体的解释在代码中都注释了,特别要注意的是,这里的特征有多个,所以在计算的时候要考虑各个维度。因为我们认为各个维度之间是独立的,所以直接相乘就可以了,所以叫做朴素贝叶斯。

import numpy as np
import pandas as pd

class NaiveBayes():
	def __init__(self,X,y):
		self.X = X
		self.y = y
		self.N = len(y)
	def nb_fit(self,X,y):
		print('西瓜数据集如下所示:')
		print(X.join(y))
		#通过unique方法来提取分类的种类
		#在这个案例中,y只有两类1和-1,在其他的案例中,可能会有多分类标签
		classes = y[y.columns[0]].unique()
		#通过.counts函数来进行计数,求出每个类别出现的个数(即总数)
		class_count = y[y.columns[0]].value_counts()
		#通过计算每个类别中个数和综述的比例,就可以得到类先验(cpp)了
		#从此可以看出来,这个频率其实是训练样本中的频率
		#或者是说可以用来学习的数据的统计特征,或者叫做知识积累
		class_prior = class_count/self.N
		print(f'类(y)先验概率如下:\n{class_prior}')
		x1_count = X[X.columns[0]].value_counts()
		x2_count = X[X.columns[1]].value_counts()
		x1_class_prior = x1_count/self.N
		x2_class_prior = x2_count/self.N
		print('特征x1(颜色)的先验概率分布为:')
		print(x1_class_prior)
		print('特征x2(尺寸)的先验概率分布为:')
		print(x2_class_prior)
		x_prior = [x1_class_prior,x2_class_prior]
		prior = dict()
		#p_x_y表示联合概率分布,也就是每个(x,y)数据对出现的频率
		#根据联合概率,可以求出先验prior分布
		for col in X.columns:
			for j in classes:
				p_x_y = X[(y==j).values][col].value_counts()
				for i in p_x_y.index:
					prior[(col,i,j)] = p_x_y[i]/class_count[j]
		# print(f'有以下几个类:\n{classes}')
		# print(f'类先验概率如下:\n{class_prior}')
		print(prior)
		print(f'似然概率表如下:')
		print('   val  y   prob')	
		for i in prior:
			print(f'{i[0]:4}{i[1]:}{i[2]:4} : {prior[i]:<5.2}')	
		return classes,class_prior,prior,x_prior

	def predict(self,X_test):
		res = []
		#利用nb_fit获得数据集的类先验信息
		classes, class_prior, prior, x_prior = self.nb_fit(self.X, self.y)
		# print(prior)
		# for p in prior:
		# 	print(p)
		for c in classes:
			#求出类先验分布,也就是好瓜和坏瓜的概率
			p_y = class_prior[c]
			#初始化联合概率p_x_y
			p_x_y = 1
			#遍历测试集中的数据
			for i in X_test.items():
				#i是一个元祖,先转换为列表,然后和c进行拼接之后再变回一个三维的元祖
				#这个元祖可以作为prior的索引得到联合概率,取这个概率的最大值的argmax就是预测分类
				index = tuple(list(i)+[c])
				#如果特征为x1即颜色,那么要除颜色概率
				if i[0]=='x1':
					p_x_y *= prior[index]/x_prior[0][i[1]]
				elif i[0]=='x2':
					p_x_y *= prior[index]/x_prior[1][i[1]]
			# res.append(p_y*p_x_y/(x_prior[0][]*x_prior[1][]))
			res.append(p_y*p_x_y)
		print(res)
		return classes[np.argmax(res)]

#特征变量x1表示西瓜的某个特征,比如颜色特征:1表示青绿;2表示乌黑;3表示浅白
x1 = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]
#特征变量x2用字符串表示西瓜的尺寸特征,'S'表示小,'M'表示中等,'L'表示大个
x2 = ['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L']
#标签变量y表示西瓜的分类,-1表示是坏瓜,1表示是好瓜
y = [-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]
df = pd.DataFrame({'x1':x1,'x2':x2,'y':y})
# print(df.head())
#使用dataframe的索引技术提取特征的两列至特征变量X,提取标签列至特征变量y
X = df[['x1','x2']]
y = df[['y']]
##nb_fit函数
##输入数据集的X和y,即特征向量矩阵和标签向量y
##输出该数据集的分类列表classes、类先验分布(CPP)class_prior、先验分布prior

#在利用predict函数对其进行预测
# predictor = predict(X_test)

nb = NaiveBayes(X,y)
#我们随机选取一组测试数据X_test
X_test = {'x1': 2, 'x2': 'S'}
print(nb.predict(X_test))

测试结果

测试集新样本

运行结果为-1证明其为坏瓜

总结

朴素贝叶斯分类器是一种基于贝叶斯定理和特征条件独立假设的简单概率分类器。它在文本分类、医疗诊断、垃圾邮件过滤等领域有着广泛的应用。这个实验的主要目的是理解和实现朴素贝叶斯分类器,并使用它来对给定的数据集进行分类。

实验的第一步是数据预处理,包括将数据集分为特征和标签,并对特征进行标准化或归一化处理。接着,我们使用朴素贝叶斯分类器的拟合函数来计算类先验概率和条件概率。在这个过程中,我们假设特征之间相互独立,这是朴素贝叶斯模型的一个关键假设。

在计算类先验概率时,我们根据标签的计数来估计每个类别的概率。然后,我们计算每个特征在每个类别下的条件概率,即给定类别的情况下特征出现的概率。这些概率可以通过统计训练数据集来得到。

有了拟合好的模型后,我们就可以使用预测函数来对新的样本进行分类。预测函数根据贝叶斯定理计算出每个类别的后验概率,并选择具有最大后验概率的类别作为预测结果。

通过这个实验,我们不仅学会了如何实现朴素贝叶斯分类器,还了解了它的工作原理和应用场景。我们还了解到,尽管朴素贝叶斯分类器在许多情况下都非常有效,但它的假设条件在现实世界中可能并不总是成立,这可能会影响它的分类性能。因此,在使用朴素贝叶斯分类器时,我们需要仔细考虑数据的特点和模型的假设条件。
 

  • 38
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值