朴素贝叶斯算法(NB) 概率图模型(1)

本文深入探讨了朴素贝叶斯算法,包括其在概率图模型中的位置,条件独立性的概念,以及如何通过极大似然估计和贝叶斯估计进行概率估计。同时,文章也讨论了算法的优缺点,指出其在短文本分类中的优势和在多数场景下的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概率图模型分为 贝叶斯网络(Bayesian Network)和 马尔可夫网络(Markov
Network)两大类。
贝叶斯网络可以用一个 有向图结构表示,如 朴素贝叶斯模型、隐马尔可夫模型、主题模型。
马尔可夫网络可以表示成一个 无向图的网络结构,如 最大熵模型、条件随机场。

朴素贝叶斯网络的图表示

概率图中,每个节点的概率可以表示为: P(当前节点|它的父节点) ,写出联合概率分布:如图中所示:

在这里插入图片描述

条件独立性

在这里插入图片描述

朴素贝叶斯算法

给定数据样本 x 时 , 其数据类别为 y j yj yj的概率:即 后验概率 P ( y j ∣ x ) P(y_j|x) P(yjx), 它反映了在看到数据样本x后yj成立的置信度

在这里插入图片描述总结:从上面的公式看出,在数据样本x的条件下,判定某样本为 y j y_j yj 类只取决于各个类条件概率的 p ( x i ∣ y j ) p(x_i|y_j) p(xiyj)的乘积和 p ( y j ) p(y_j) p(yj)的乘积。

极大似然估计与贝叶斯估计的朴素贝叶斯概率估计公式
  1. 在上面的朴素贝叶斯算法中,要计算后验概率需要计算极大似然概率 P ( Y = c k ) P(Y=c_k) P(Y=ck) P ( X j = c k ∣ Y = c k ) P(X_j = c_k| Y=c_k) P(Xj=ckY=ck),可以使用极大似然估计来求这两个概率(其实就是统计)。
  2. 贝叶斯估计是极大似然估计的优化,是为了解决某些类别频数为0时带来的 P ( Y = c k ) P(Y=c_k) P(Y=ck) P ( X j = c k ∣ Y = c k ) P(X_j = c_k| Y=c_k) P(Xj=ckY=ck)为零的情况,因此引入了拉普拉斯平滑。

P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + ∣ C ∣ λ P(Y=c_k) = \frac{\sum_{i=1}^{N} I(y_i=c_k)+\lambda}{N+ |C|\lambda} P(Y=ck)=N+Cλi=1NI(yi=ck)+λ

P ( X j = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + ∣ V ∣ λ P(Xj=a_{jl} |Y=c_k) = \frac{\sum_{i=1}^{N} I(x_i=a_{jl}, y_i=c_k)+\lambda}{\sum_{i=1}^{N} I(y_i=c_k)+ |V|\lambda} P(Xj=ajlY=ck)=i=1NI(yi=ck)+Vλi=1NI(xi=ajl,yi=ck)+λ

优缺点

优点:简单,对一些短文本的分类效果不错。
缺点:条件独立性假设很强,再多数场景下分类精确度不高。

损失

与KNN算法一样,朴素贝叶斯算法的后验概率最大等价于最小化 0-1 损失的经验风险。

在实现基于朴素贝叶斯算法的图像分类器时,首先需要将图像数据转换为适合概率模型处理的形式。通常情况下,图像会被转换为特征向量形式,例如通过像素值、直方图特征或更高级的特征提取方[^1]。以下是一个基于朴素贝叶斯算法进行图像分类的伪代码实现: ### 图像预处理 ```python # 假设images是包含所有图像的数据集,labels是对应的类别标签 def preprocess_images(images): # 将图像转换为特征向量(例如像素值) features = [] for image in images: # 调整图像大小为固定尺寸,并展平为一维数组 resized_image = resize(image, (width, height)) feature_vector = flatten(resized_image) features.append(feature_vector) return features ``` ### 朴素贝叶斯分类器伪代码 ```python class NaiveBayesClassifier: def __init__(self): self.class_probabilities = {} # 存储每个类别的先验概率 self.feature_probabilities = {} # 存储每个特征在各个类别下的条件概率 def fit(self, X, y): # 计算每个类别的先验概率 class_counts = count_classes(y) total_samples = len(y) for class_label, count in class_counts.items(): self.class_probabilities[class_label] = count / total_samples # 计算每个特征在各个类别下的条件概率 for class_label in unique_classes(y): # 提取属于当前类别的样本 class_samples = [X[i] for i in range(len(X)) if y[i] == class_label] # 计算每个特征在该类别下的概率分布 feature_distributions = compute_feature_distributions(class_samples) self.feature_probabilities[class_label] = feature_distributions def predict(self, X): predictions = [] for sample in X: # 对每个样本计算其属于每个类别的后验概率 probabilities = {} for class_label in self.class_probabilities: # 初始概率为类别的先验概率 probability = self.class_probabilities[class_label] # 乘以每个特征在该类别下的条件概率 for feature_index, feature_value in enumerate(sample): probability *= self.feature_probabilities[class_label][feature_index][feature_value] probabilities[class_label] = probability # 选择概率最大的类别作为预测结果 predicted_class = max(probabilities, key=probabilities.get) predictions.append(predicted_class) return predictions ``` ### 模型训练与预测 ```python # 假设X_train和y_train是预处理后的训练数据及其标签 X_train = preprocess_images(images_train) y_train = labels_train # 创建并训练朴素贝叶斯分类器 nb_classifier = NaiveBayesClassifier() nb_classifier.fit(X_train, y_train) # 对测试集进行预测 X_test = preprocess_images(images_test) predictions = nb_classifier.predict(X_test) ``` 以上伪代码提供了一个基本框架,实际应用中可能需要根据具体需求调整特征提取方、概率计算方式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值