【數據挖掘】貝葉斯分類學習—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
英文地址,請注明出處:http://en.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/ 下載網…