【数据挖掘】贝叶斯分类学习—NaiveBayes

NaiveBayes

        朴素贝叶斯的核心是贝叶斯定理,它描述了如何根据新证据更新事件的概率。

要求:

        1、实现朴素贝叶斯分类算法,验证算法的正确性,并将算法应用于给定的数据集Data_User_Modeling数据集,选择一部分数据集作为已知结果,然后用剩下的数据集作为测试集,验证算法的分类情况

        2、重新选取训练样本和测试集,对比并分析分类结果

        3、选取一部分数据集作为训练样本,实现分类;不断从测试集中选取数据加入到训练集中,对比并分析分类结果

代码实现:

import pandas as pd
import numpy as np
from math import pi, sqrt, exp# ========================== 数据预处理 ==========================
# 配置文件路径(请根据实际路径修改)
DATA_PATH = r"D:\课程\数据挖掘\实验四\实验4-Data_User_Modeling_Dataset_Hamdi Tolga KAHRAMAN.xls"# 读取Excel数据
excel_file = pd.ExcelFile(DATA_PATH)
df = excel_file.parse('Training_Data')  # 假设工作表名为'Training_Data'# 数据清洗:统一目标变量格式(转为小写并去除空格)
df['UNS'] = df['UNS'].str.strip().str.lower()# 划分训练集和测试集(70%训练,30%测试)
train_df = df.sample(frac=0.7, random_state=42)
test_df = df.drop(train_df.index)# 分离特征和标签
X_train = train_df.drop('UNS', axis=1)
y_train = train_df['UNS']
X_test = test_df.drop('UNS', axis=1)
y_test = test_df['UNS']# ========================== 朴素贝叶斯算法实现 ==========================
class NaiveBayesClassifier:def __init__(self):self.classes = None       # 存储类别标签self.mean = {}            # 各特征在类别下的均值self.var = {}             # 各特征在类别下的方差self.prior = {}           # 类别先验概率def fit(self, X, y):"""训练模型,计算类别统计量"""self.classes = np.unique(y)  # 获取所有类别n_samples, n_features = X.shape  # 样本数和特征数for cls in self.classes:cls_data = X[y == cls]  # 提取当前类别数据self.mean[cls] = cls_data.mean(axis=0)  # 计算各特征均值self.var[cls] = cls_data.var(axis=0, ddof=1)  # 计算无偏方差(ddof=1)self.prior[cls] = len(cls_data) / n_samples  # 计算先验概率def _gaussian_probability(self, x, mean, var):"""计算高斯分布的概率密度函数(连续特征)"""exponent = exp(-((x - mean) ** 2) / (2 * var))denominator = sqrt(2 * pi * var)return exponent / denominatordef predict(self, X):"""预测样本类别"""predictions = []for _, sample in X.iterrows():posteriors = {}for cls in self.classes:# 计算先验概率(取对数避免下溢)prior = np.log(self.prior[cls])# 计算似然概率(特征独立假设,乘积转对数求和)likelihood = 1.0for feature in X.columns:prob = self._gaussian_probability(sample[feature],self.mean[cls][feature],self.var[cls][feature])likelihood *= prob if prob != 0 else 1e-10  # 处理零概率# 后验概率 = 先验概率 * 似然概率(取对数域计算)posterior = prior + np.log(likelihood)posteriors[cls] = posterior# 选择后验概率最大的类别predictions.append(max(posteriors, key=posteriors.get))return np.array(predictions)# ========================== 模型训练与评估 ==========================
# 创建分类器实例并训练
nb_classifier = NaiveBayesClassifier()
nb_classifier.fit(X_train, y_train)# 预测测试集
y_pred = nb_classifier.predict(X_test)# 计算准确率
accuracy = np.sum(y_pred == y_test) / len(y_test)
print(f"朴素贝叶斯分类准确率: {accuracy * 100:.2f}%")# ========================== 可选:增量学习实验(按实验要求扩展) ==========================
def incremental_learning_evaluation(initial_train, test_data, steps=5):"""逐步将测试数据加入训练集,观察准确率变化"""train_data = initial_train.copy()X_incr = test_data.drop('UNS', axis=1)y_incr = test_data['UNS']n_test = len(X_incr)step_size = n_test // steps if n_test >= steps else n_test  # 避免除数为0for i in range(steps):start_idx = i * step_sizeend_idx = (i + 1) * step_sizeadd_X = X_incr.iloc[start_idx:end_idx]add_y = y_incr.iloc[start_idx:end_idx]# 合并训练数据train_data = pd.concat([train_data, pd.concat([add_X, add_y], axis=1)])current_X_train = train_data.drop('UNS', axis=1)current_y_train = train_data['UNS']# 重新训练模型incr_classifier = NaiveBayesClassifier()incr_classifier.fit(current_X_train, current_y_train)# 预测剩余测试数据remaining_X_test = X_incr.iloc[end_idx:]remaining_y_test = y_incr.iloc[end_idx:]if not remaining_X_test.empty:y_pred_incr = incr_classifier.predict(remaining_X_test)current_accuracy = np.sum(y_pred_incr == remaining_y_test) / len(remaining_y_test)print(f"加入{end_idx}条数据后准确率: {current_accuracy * 100:.2f}%")else:print("所有测试数据已加入训练集")# 执行增量学习实验(可选,取消注释后运行)
# incremental_learning_evaluation(train_df, test_df, steps=5)

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86801.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试宝典:基础二

🔒 25. final vs abstract 关键字 关键字修饰对象作用规则final类禁止被继承final class MyClass { ... }方法禁止被子类重写public final void func()变量变为常量(基本类型值不可变,引用类型地址不可变)final int MAX 100;abs…

小米手机安装charles证书

使用红米手机下载Charles证书一直下载中,无法正常下载。 不使用原装浏览器,使用第三方浏览器下载就可以了。 使用第三方浏览器安装,如我使用的是UC浏览器 使用第三方浏览器安装的证书格式是".pem"格式问卷 将这个文件放入小米的dow…

DeepSeek R2 推迟发布:因 H20 算力短缺

DeepSeek 今年早些时候凭借其 R1 AI 模型备受广泛关注。据《The Information》报道,R2 模型的工作似乎因 H20 处理器而停滞不前。 DeepSeek尚未透露其R2 模型的具体上市时间。 DeepSeek 使用 5 万块 Hopper GPU(包括 3 万块 H20、1 万块 H800 和 1 万块…

智能之火,重塑创造:大模型如何点燃新一代开发引擎?

导言:普罗米修斯之火再现 在科技演进的长河中,每一次生产力的跃迁都伴随着工具的质变。从蒸汽机轰鸣到电力普及,再到信息高速公路的铺就,人类驾驭能量的能力不断突破。今天,我们站在一个崭新的临界点上:大语…

一文入门JS

转自个人博客 因为本人经常使用QML,而由于QML与JS之间的关系,本人经常使用到JS相关语法,所以在此系统性对JS基础知识进行总结、记录。 1. 入门 JavaScript(简称 JS)是一种广泛应用于Web开发的脚本语言,它…

libtool: error: ‘/usr/.local/lib/libgmp.la‘ is not a valid libtool archive

背景: 安装gcc时提示需要vc11,然后安装gcc依赖gmp、mpfr、mpc。 到mpc make时出错: libtool: error: ‘/usr/.local/lib/libgmp.la’ is not a valid libtool archive 详细: /usr/bin/grep: /usr/.local/lib/libgmp.la: No such f…

HDC2025聚焦鸿蒙生态,FairGuard加固方案保驾护航

近日,在2025年华为开发者大会(HDC)上,华为正式启动HarmonyOS 6开发者Beta,并全面展示一年多以来与合作伙伴共建鸿蒙生态的创新成果:“累计有9000多个应用参与了70多个系统级创新体验的联合打造,目前有3万多鸿蒙应用和元…

GAN的思考及应用

一、对文献的思考 CycleGAN的思考,前两周看到了关于CycleGAN的原始论文,是用于处理图像数据,有了如下思考: 1、基础理论与方法 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》是Cycle…

Xcode26新特性与iOS26适配指南

Xcode 26 新特性 在 WWDC25 上 Apple 推出了 Xcode 26,相比较 Xcode 16,它有如下的变化。 项目 安装包更小,其他组件与工具链只有在需要时才会下载。设置界面重新设计,菜单从顶部挪到了左侧,其中 Accounts 改名为 Apple Accounts,Text Editing 改名为 Editing,Key Bind…

闲庭信步使用SV搭建图像测试平台:第二十课——RGB图像转HSV图像

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注…

Django的CSRF保护机制

一、Django的CSRF保护机制 1. 核心原理 作用&#xff1a;防止跨站请求伪造&#xff08;CSRF&#xff09;攻击&#xff0c;确保表单提交来源可信。实现方式&#xff1a; 在模板中使用{% csrf_token %}生成一个隐藏的<input>字段&#xff08;如csrfmiddlewaretoken&#…

JavaScript中的回调函数详解

JavaScript中的回调函数详解 1.1 概念 1.1.1 什么是回调函数 **回调函数&#xff08;Callback Function&#xff09;**是你将一个函数的引用&#xff08;指针&#xff09;作为参数传递给另一个函数&#xff0c;在那个函数完成任务后调用回来执行你传递的函数。简单的来说就是…

Utils系列之内存池(Fixed size)

内存池核心介绍 废话不多说&#xff0c;show you code. 我实现了两套内存池&#xff0c;一个是固定大小的内存池&#xff0c;一个是多重不同大小的内存池。 Fixed size memory pool 设计思路&#xff1a; 我们一个个看&#xff0c;首先我们定义了一个chunk, chunk 里面包含…

ubuntu安装docker遇到权限问题

问题现象&#xff1a; 使用snap安装的docker&#xff0c;执行docker build命令构建景象时报错&#xff1a; [] Building 0.1s (1/1) FINISHED docker:default > [internal] load build definition from Dockerfile 0.0s > > transferring dockerfile: 2B 0.0s ERROR:…

在Linux系统中部署Java项目

1.在Linux中启动mysql的服务: systemctl start mysql可以采用以下代码查看状态: systemctl status mysql如下图展示绿色代表启动成功 2.之后进入mysql mysql -uroot -p输入自己的密码&#xff0c;这里的密码不会显示,直接输入即可 3.在DG中连接Linux的数据库 4.修改配置文件…

C++洛谷P1002 过河卒

题目 链接&#xff1a;https://www.luogu.com.cn/problem/P1002 解析 这道题适用于了解动态规划的同学。 变量初始化 初始化B点坐标&#xff08;n, m&#xff09;和马的坐标&#xff08;a, b&#xff09; 初始化方向数组和动态规划数组 long long dp[30][30]; int dx[8] …

BlogX项目Go-gin--根据IP获取地理位置

先定义一个函数来判断IP地址是否为内网&#xff0c;归为工具类 // utils/ip/enter.go package ipimport "net"func HasLocalIPAddr(ip string) bool {return HasLocalIP(net.ParseIP(ip)) }// HasLocalIP 检测 IP 地址是否是内网地址 // 通过直接对比ip段范围效率更…

鸿蒙系统(HarmonyOS)应用开发之实现瀑布流图片展示效果

项目概述 科技图库是一款基于鸿蒙系统&#xff08;HarmonyOS&#xff09;开发的高品质图片浏览应用&#xff0c;专注于展示精选科技主题图片。应用采用现代化的瀑布流布局&#xff0c;为用户提供流畅、直观的浏览体验&#xff0c;让科技之美尽收眼底。 主要功能 1. 瀑布流布…

【fish-speech】新模型openaudio-s1-mini尝鲜

一、配置 显卡&#xff1a;v100&#xff08;测试简短语句&#xff0c;显存实际占用不足6G&#xff09; 二、安装测试 1. 安装 1.1 下载源码 git clone https://github.com/fishaudio/fish-speech.git1.2 安装系统组件 apt install portaudio19-dev libsox-dev ffmpeg1.3 …

介绍Windows下的由Sysinternals开发的一些小工具

Sysinternals是一个开发了很多Windows下系统工具的公司&#xff0c;这些工具能极大地提高对Windows系统的深入认知。就像它的名字Sys(tem)internals&#xff0c;深入系统里面。这些工具都放在微软的网站上可以下载到。https://learn.microsoft.com/en-us/sysinternals/ 下载网…