news 2026/6/15 17:17:04

机器学习——朴素贝叶斯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习——朴素贝叶斯

一、算法介绍

朴素贝叶斯是基于贝叶斯定理的特征条件独立假设分类算法,通过先验概率和特征条件概率计算后验概率,适用于文本分类和混合特征数据。

特点:

  1. 核心假设:特征条件独立性假设(朴素之处)

  2. 计算高效:训练和预测时间复杂度低

  3. 内存友好:仅需存储概率参数

  4. 可解释性:概率输出直观易懂

  5. 多场景:支持离散、连续和混合特征

  6. 平滑处理:可避免零概率问题

  7. 小样本:在小数据集上表现良好

应用领域:

  1. 文本分类:垃圾邮件过滤、新闻分类、情感分析

  2. 推荐系统:商品推荐、内容推荐

  3. 医学诊断:疾病预测、症状分析

  4. 金融风控:欺诈检测、信用评估

  5. 工业检测:故障诊断、质量控制

  6. 自然语言处理:文档分类、主题识别

  7. 生物信息学:基因分类、蛋白质分析

  8. 实时系统:需要快速响应的应用场景

算法原理:

朴素贝叶斯算法基于贝叶斯定理进行推导:

  • P(Y∣X) 为后验概率(已知特征 X 下属于类别 Y 的概率)

  • P(X∣Y)为似然概率(类别 Y 下特征 X出现的概率)

  • P(Y)为先验概率(类别 Y的初始概率)

  • P(X) 为证据(特征 X出现的总概率)

算法“朴素”之处在于假设各特征条件独立:

该假设将复杂的联合概率分解为多个独立特征概率的乘积,大幅简化了计算。

二、应用

朴素贝叶斯西瓜分类器

1.数据准备

2.对于离散特征频率估计连续特征高斯分布

离散特征处理方法

对于分类问题中的离散特征(如色泽、根蒂等),通常使用多项式朴素贝叶斯伯努利朴素贝叶斯

1. 核心公式(多项式分布)

参数说明:

  • Ny,v​:类别 y 中特征 xi取值为 v 的样本数

  • Ny:类别 y 的总样本数

  • K:特征 xi​ 的可能取值个数

  • α:平滑参数(α=1α=1 时为拉普拉斯平滑)

连续特征处理方法

对于连续特征(如密度、含糖率),采用高斯朴素贝叶斯

1. 核心假设

假设连续特征在每个类别下服从正态分布(高斯分布)。

2. 概率密度函数

参数说明:

  • μy:类别 y 下特征 xi 的均值

  • σy​:类别 y 下特征 xi​ 的标准差

  • xi​:待预测样本的特征值

3.代码实现

import numpy as np import pandas as pd from scipy.stats import norm # 正态分布概率密度计算 # 构建西瓜数据集3.0 data = { '色泽': ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿', '浅白', '浅白', '青绿', '浅白', '乌黑', '浅白', '青绿'], '根蒂': ['蜷缩', '蜷缩', '蜷缩', '蜷缩', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '硬挺', '硬挺', '硬挺', '稍蜷', '蜷缩', '稍蜷', '稍蜷', '蜷缩', '硬挺'], '敲声': ['浊响', '沉闷', '浊响', '沉闷', '浊响', '浊响', '沉闷', '浊响', '清脆', '清脆', '浊响', '沉闷', '浊响', '清脆', '沉闷', '浊响', '沉闷'], '纹理': ['清晰', '清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '清晰', '稍糊', '模糊', '模糊', '稍糊', '清晰', '模糊', '稍糊', '清晰', '稍糊'], '脐部': ['凹陷', '凹陷', '凹陷', '凹陷', '凹陷', '稍凹', '稍凹', '凹陷', '平坦', '平坦', '平坦', '稍凹', '凹陷', '平坦', '稍凹', '凹陷', '平坦'], '触感': ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '软粘', '软粘', '硬滑', '软粘', '硬滑', '软粘', '硬滑', '硬滑', '硬滑', '软粘', '硬滑', '硬滑'], '密度': [0.697, 0.774, 0.634, 0.608, 0.556, 0.403, 0.481, 0.437, 0.666, 0.243, 0.245, 0.343, 0.639, 0.657, 0.360, 0.593, 0.719], '含糖率': [0.460, 0.376, 0.264, 0.318, 0.215, 0.237, 0.149, 0.211, 0.091, 0.267, 0.057, 0.099, 0.161, 0.198, 0.370, 0.042, 0.103], '好瓜': ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否'] } df = pd.DataFrame(data) # 待预测样本(测1):与样本1完全一致 test_sample = { '色泽': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '密度': 0.697, '含糖率': 0.460 } class NaiveBayesWatermelon: def __init__(self, df, label_col='好瓜'): self.df = df self.label_col = label_col self.labels = df[label_col].unique() # 标签:['是', '否'] self.discrete_cols = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感'] # 离散属性 self.continuous_cols = ['密度', '含糖率'] # 连续属性 # 存储先验概率、离散属性条件概率、连续属性的均值/方差 self.prior_prob = {} # 先验概率 P(好瓜=是/否) self.discrete_cond_prob = {} # 离散属性条件概率 P(属性=值|标签) self.continuous_params = {} # 连续属性的均值和方差 (mu, sigma²) # 初始化计算 self._calc_prior_prob() self._calc_discrete_cond_prob() self._calc_continuous_params() # 步骤1:计算先验概率 P(好瓜=是/否) def _calc_prior_prob(self): total = len(self.df) for label in self.labels: self.prior_prob[label] = len(self.df[self.df[self.label_col] == label]) / total # 步骤2:计算离散属性的条件概率(拉普拉斯平滑) def _calc_discrete_cond_prob(self): for col in self.discrete_cols: self.discrete_cond_prob[col] = {} # 该属性的所有唯一取值 all_vals = self.df[col].unique() n_vals = len(all_vals) # 属性取值数量(拉普拉斯平滑分母用) for label in self.labels: self.discrete_cond_prob[col][label] = {} # 该标签下的样本数 n_label = len(self.df[self.df[self.label_col] == label]) for val in all_vals: # 该标签下,属性=val的样本数 n_val_label = len(self.df[(self.df[self.label_col] == label) & (self.df[col] == val)]) # 拉普拉斯平滑:P = (n_val_label + 1) / (n_label + n_vals) self.discrete_cond_prob[col][label][val] = (n_val_label + 1) / (n_label + n_vals) # 处理未出现在训练集的取值(兜底) self.discrete_cond_prob[col][label]['unknown'] = 1 / (n_label + n_vals) # 步骤3:计算连续属性的均值和方差(正态分布参数) def _calc_continuous_params(self): for col in self.continuous_cols: self.continuous_params[col] = {} for label in self.labels: # 该标签下的连续属性值 vals = self.df[self.df[self.label_col] == label][col] mu = vals.mean() # 均值 sigma2 = vals.var() # 方差 self.continuous_params[col][label] = (mu, sigma2) # 步骤4:计算单个样本的后验概率 def _calc_posterior_prob(self, sample): posterior = {} for label in self.labels: # 先验概率 prob = self.prior_prob[label] # 1. 乘离散属性的条件概率 for col in self.discrete_cols: val = sample[col] # 若取值不在训练集,用unknown的概率 if val in self.discrete_cond_prob[col][label]: prob *= self.discrete_cond_prob[col][label][val] else: prob *= self.discrete_cond_prob[col][label]['unknown'] # 2. 乘连续属性的正态分布概率密度 for col in self.continuous_cols: val = sample[col] mu, sigma2 = self.continuous_params[col][label] sigma = np.sqrt(sigma2) # 正态分布概率密度 prob *= norm.pdf(val, loc=mu, scale=sigma) posterior[label] = prob return posterior # 预测样本类别 def predict(self, sample): posterior = self._calc_posterior_prob(sample) # 取后验概率最大的标签 pred_label = max(posterior, key=posterior.get) return pred_label, posterior # 初始化朴素贝叶斯分类器 nb = NaiveBayesWatermelon(df) # 预测“测1”样本 pred_label, posterior = nb.predict(test_sample) # 输出结果 print("=== 朴素贝叶斯分类结果 ===") print(f"先验概率:P(好瓜=是) = {nb.prior_prob['是']:.4f}, P(好瓜=否) = {nb.prior_prob['否']:.4f}") print(f"\n测1样本的后验概率:") print(f"P(好瓜=是|测1) = {posterior['是']:.8f}") print(f"P(好瓜=否|测1) = {posterior['否']:.8f}") print(f"\n最终分类结果:测1是【{pred_label}】瓜")

4.运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 1:24:56

Windows系统文件user32.dll丢失损坏 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/15 13:54:44

Windows系统文件Vb5stkit.dll丢失损坏 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/5 5:20:18

12-22 关于顺FENG在数字化转型方向上的思考

很多企业在“数字化转型”这个词上是高度一致的,认为是公司的第二曲线,是讲故事的重要砝码,类似树根互联、卡奥斯以及类似石化盈科、昆仑数智等数科公司比比皆是,但在认知深度与行动方式上,却存在明显分层。在交流中&a…

作者头像 李华
网站建设 2026/6/14 3:52:12

[模式识别-从入门到入土] 组合分类器

[模式识别-从入门到入土] 组合分类器 知乎:https://www.zhihu.com/people/byzh_rc CSDN:https://blog.csdn.net/qq_54636039 注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码 参考文章:各方资…

作者头像 李华
网站建设 2026/6/8 20:08:20

记录一个二级Map构建处理赋值简洁写法

//查到数据集合 List<OldpcZzjcqkVo> allData dataWorkParameterMapper.selectAllStatisticsByUnion(dto);// 构建二级Map: workType -> (companyId -> count)Map<String, Map<Long, Integer>> workTypeCompanyCountMap allData.stream…

作者头像 李华
网站建设 2026/6/15 15:19:38

智能体:谷歌A2A协议详解

摘要A2A&#xff08;Agent-to-Agent&#xff09;协议是一种用于智能体&#xff08;Agent&#xff09;之间通信、协作与互操作的标准化协议。随着人工智能技术的发展&#xff0c;尤其是多智能体系统&#xff08;Multi-Agent Systems, MAS&#xff09;在自动驾驶、智能制造、金融…

作者头像 李华