朴素贝叶斯分类器 Python 实现:从零手写 2 个核心函数与拉普拉斯平滑

发布时间:2026/8/30 8:28:00

朴素贝叶斯分类器 Python 实现:从零手写 2 个核心函数与拉普拉斯平滑
从零实现朴素贝叶斯分类器核心函数与平滑技术实战1. 朴素贝叶斯算法原理精要朴素贝叶斯分类器是基于贝叶斯定理与特征条件独立假设的分类方法。其核心思想是通过先验概率和条件概率来计算后验概率从而实现对样本的分类决策。让我们先看一个简单的例子假设我们要判断一封邮件是否为垃圾邮件。已知垃圾邮件中出现免费一词的概率是80%正常邮件中出现免费一词的概率是10%整体邮件中垃圾邮件的占比是20%当新邮件包含免费时我们可以计算P(垃圾|免费) P(免费|垃圾) * P(垃圾) / P(免费) 0.8 * 0.2 / (0.8*0.2 0.1*0.8) 0.16 / 0.24 ≈ 0.667这个计算过程体现了贝叶斯定理的核心思想利用已知信息更新概率估计。关键数学公式朴素贝叶斯的分类决策基于以下公式P(y|x₁,x₂,...,xₙ) ∝ P(y) * ∏ P(xᵢ|y)其中P(y)是类先验概率P(xᵢ|y)是特征条件概率∏表示连乘基于特征独立假设2. 核心函数实现2.1 数据准备我们先定义一个简单的性别分类数据集import numpy as np # 特征身高(cm), 体重(kg), 脚长(cm) X np.array([ [180, 75, 42], # 男 [175, 70, 41], # 男 [170, 65, 38], # 女 [165, 55, 36], # 女 [185, 80, 43], # 男 [168, 60, 37] # 女 ]) y np.array([男, 男, 女, 女, 男, 女])2.2 基础版分类器实现class NaiveBayesClassifier: def __init__(self): self.label_prob {} # 类别先验概率 self.condition_prob {} # 条件概率 def fit(self, X, y): 训练模型计算先验概率和条件概率 n_samples len(X) n_features X.shape[1] # 计算类先验概率 unique_labels, counts np.unique(y, return_countsTrue) self.label_prob dict(zip(unique_labels, counts / n_samples)) # 计算条件概率 for label in unique_labels: # 获取当前类别的样本 X_label X[y label] # 初始化当前类别的条件概率结构 self.condition_prob[label] {} # 对每个特征计算条件概率 for i in range(n_features): feature_values X_label[:, i] unique_values, value_counts np.unique(feature_values, return_countsTrue) # 存储特征值的概率分布 self.condition_prob[label][i] dict(zip( unique_values, value_counts / len(feature_values) )) def predict(self, X): 预测新样本的类别 predictions [] for sample in X: max_prob -1 best_label None # 对每个类别计算后验概率 for label in self.label_prob: # 初始化为类先验概率 prob self.label_prob[label] # 乘以各个特征的条件概率 for i, value in enumerate(sample): if value in self.condition_prob[label][i]: prob * self.condition_prob[label][i][value] else: # 遇到未见过的特征值概率设为0 prob 0 break # 选择概率最大的类别 if prob max_prob: max_prob prob best_label label predictions.append(best_label) return np.array(predictions)2.3 核心函数解析fit函数实现了两个关键计算类先验概率统计每个类别在训练集中的出现频率条件概率对每个特征统计在给定类别下各特征值的出现频率predict函数的工作流程对每个测试样本初始化后验概率为类先验概率乘以各特征的条件概率基于训练集统计选择使后验概率最大的类别作为预测结果3. 拉普拉斯平滑技术3.1 零概率问题当测试数据中出现训练集中未出现的特征值时基础版分类器会将该特征的条件概率设为0导致整个后验概率为0。例如# 训练数据中没有身高190cm的样本 test_sample [190, 70, 40] # 预测时会因为P(身高190|男)0而导致分类失败3.2 平滑实现方案拉普拉斯平滑通过在分子加1、分母加类别数来解决零概率问题class NaiveBayesClassifierSmooth: def __init__(self, alpha1): self.alpha alpha # 平滑系数 self.label_prob {} self.condition_prob {} def fit(self, X, y): n_samples len(X) n_features X.shape[1] # 计算平滑后的类先验概率 unique_labels, counts np.unique(y, return_countsTrue) total_labels len(unique_labels) self.label_prob { label: (count self.alpha) / (n_samples total_labels * self.alpha) for label, count in zip(unique_labels, counts) } # 计算平滑后的条件概率 for label in unique_labels: X_label X[y label] self.condition_prob[label] {} for i in range(n_features): feature_values X_label[:, i] unique_values, value_counts np.unique(feature_values, return_countsTrue) n_values len(unique_values) # 应用拉普拉斯平滑 self.condition_prob[label][i] { value: (count self.alpha) / (len(X_label) n_values * self.alpha) for value, count in zip(unique_values, value_counts) } # 添加一个未知项来处理未见过的特征值 self.condition_prob[label][i][unknown] self.alpha / (len(X_label) n_values * self.alpha) def predict(self, X): predictions [] for sample in X: max_prob -1 best_label None for label in self.label_prob: prob np.log(self.label_prob[label]) # 使用对数防止下溢 for i, value in enumerate(sample): # 如果特征值未见过使用unknown概率 prob_dict self.condition_prob[label][i] if value in prob_dict: prob np.log(prob_dict[value]) else: prob np.log(prob_dict[unknown]) if prob max_prob: max_prob prob best_label label predictions.append(best_label) return np.array(predictions)3.3 平滑效果对比我们通过一个对比表格展示平滑前后的差异情况基础版平滑版处理未见特征值概率为0使用平滑概率数值稳定性可能下溢使用对数更稳定极端情况可能误判更鲁棒计算复杂度略低略高4. 实际应用与性能优化4.1 文本分类示例朴素贝叶斯在文本分类中表现优异。以下是一个简单的垃圾邮件分类实现from sklearn.feature_extraction.text import CountVectorizer # 示例数据 texts [ 免费 赢取 百万大奖, # 垃圾邮件 明天 开会 通知, # 正常邮件 优惠 折扣 限时, # 垃圾邮件 项目 进度 报告 # 正常邮件 ] labels [spam, ham, spam, ham] # 文本向量化 vectorizer CountVectorizer(token_patternr\b\w\b) X vectorizer.fit_transform(texts) # 训练分类器 nb NaiveBayesClassifierSmooth() nb.fit(X.toarray(), labels) # 测试新样本 test_text 免费 会议 通知 test_vec vectorizer.transform([test_text]) print(nb.predict(test_vec.toarray())) # 输出预测类别4.2 性能优化技巧对数概率计算将概率相乘转换为对数相加防止数值下溢特征选择使用卡方检验等方法选择信息量大的特征并行计算对大数据集可并行化概率统计过程稀疏矩阵优化对文本数据使用稀疏矩阵存储# 使用对数概率的predict实现示例 def predict_log_prob(self, X): predictions [] for sample in X: max_log_prob -np.inf best_label None for label in self.label_prob: log_prob np.log(self.label_prob[label]) for i, value in enumerate(sample): if value in self.condition_prob[label][i]: log_prob np.log(self.condition_prob[label][i][value]) else: log_prob np.log(self.alpha) - np.log(len(self.condition_prob[label][i]) * self.alpha np.sum(list(self.condition_prob[label][i].values()))) if log_prob max_log_prob: max_log_prob log_prob best_label label predictions.append(best_label) return np.array(predictions)5. 算法评估与比较5.1 评估指标朴素贝叶斯分类器的常用评估指标包括准确率正确分类样本的比例精确率与召回率特别适用于类别不平衡的场景F1分数精确率和召回率的调和平均ROC-AUC衡量分类器排序能力的指标5.2 不同变体比较朴素贝叶斯有几种常见变体适用于不同场景类型假设分布适用场景高斯朴素贝叶斯正态分布连续特征多项式朴素贝叶斯多项式分布文本分类、计数数据伯努利朴素贝叶斯伯努利分布二值特征5.3 优缺点分析优势训练和预测速度快对小规模数据表现良好对无关特征相对鲁棒实现简单易于理解局限特征独立性假设在实际中往往不成立对输入数据的分布形式敏感需要足够的训练数据来估计概率在实际项目中我经常将朴素贝叶斯作为基线模型它的快速训练和预测能力能帮助快速验证特征的有效性。特别是在文本分类任务中即使有更复杂的模型可选朴素贝叶斯往往也能提供不错的性能。

相关新闻

动态规划算法 Python 实现:从 4 阶段图例到 100x100 栅格地图路径规划

动态规划算法 Python 实现:从 4 阶段图例到 100x100 栅格地图路径规划

2026/8/29 6:46:44

动态规划算法 Python 实现:从 4 阶段图例到 100x100 栅格地图路径规划在机器人导航和游戏开发中,路径规划是一个核心问题。想象一下,你正在开发一个仓库物流机器人,它需要在复杂的货架迷宫中找到最优路径搬运货物。传统的暴力搜索…

电影票房预测:5种回归模型Stacking融合实战,RMSE降低至0.2934

电影票房预测:5种回归模型Stacking融合实战,RMSE降低至0.2934

2026/8/24 21:27:08

电影票房预测:5种回归模型Stacking融合实战,RMSE降低至0.2934电影票房预测一直是数据科学在娱乐产业中的重要应用场景。随着机器学习技术的快速发展,如何通过模型融合技术提升预测精度成为业界关注的焦点。本文将深入探讨Stacking集成方法在票…

AMD Ryzen调试工具SMUDebugTool:免费开源的硬件性能调优终极指南

AMD Ryzen调试工具SMUDebugTool:免费开源的硬件性能调优终极指南

2026/8/28 0:28:20

AMD Ryzen调试工具SMUDebugTool:免费开源的硬件性能调优终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

2026/8/30 8:21:43

简介:本资源是一套面向本科毕业设计与人工智能课程实践的多无人机三维协同控制方案,聚焦于复杂动态环境下多机编队保持与实时避障两大核心挑战,采用深度强化学习前沿算法MAPPO实现分布式智能决策。压缩包共6个文件(4个Python脚本、…

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

2026/8/30 8:21:43

简介:这是一套基于苹果CMS开发的三端(PC手机H5App)影视网站源码,面向影视站长、PHP初中级开发者及个人建站爱好者,解决快速搭建自动采集电影电视剧网站的核心需求。资源包共2000个文件,含671个PHP后端逻辑文…

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

2026/8/30 8:21:43

简介:这是一套面向Web开发者与平台运营人员的实战型学习资源,聚焦在线打赏系统的设计与支付集成,尤其适用于内容平台、直播社区等需高并发打赏能力的场景。资源包含完整可运行的运营级打赏程序源码及配套视频教程,覆盖环境部署、支…

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

2026/8/30 8:21:43

在科技投资领域,很少有人能像 Leopold Aschenbrenner 这样,把“技术判断”和“巨额资金”绑得如此紧密。一则关于他管理的资金从 1 亿美元增长到 450 亿美元、同时又“几乎爆仓”的讨论,最近在技术圈反复被提起。这件事之所以值得技术人关注&…

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

2026/8/30 8:21:43

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手 【免费下载链接】minimind 🧠 Train a 64M-parameter LLM from scratch in just 2h! 项目地址: https://gitcode.com/GitHub_Trending/min/minimind 周一上午九点,社区…

电影票房大数据分析全链路:Python爬虫+Spark+可视化

电影票房大数据分析全链路:Python爬虫+Spark+可视化

2026/8/30 8:11:43

在大数据毕业设计中,电影票房数据分析与可视化属于典型的“数据采集 -> 数据存储 -> 数据清洗 -> 数据分析 -> 可视化展示”全链路项目。它覆盖了 Python 爬虫、Hadoop HDFS、Spark SQL、数据库设计和前端图表展示等多个环节,既能体现工程能…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…