人工智能數學基礎實驗(四):最大似然估計的-AI 模型訓練與參數優化

一、實驗目的

  1. 理解最大似然估計(MLE)原理:掌握通過最大化數據出現概率估計模型參數的核心思想。
  2. 實現 MLE 與 AI 模型結合:使用 MLE 手動估計樸素貝葉斯模型參數,并與 Scikit-learn 內置模型對比,深入理解參數優化對分類性能的影響。
  3. 分析模型性能影響因素:探究訓練集 / 測試集比例、特征數量對模型準確率、運行時間的影響,提升數據建模與調優能力。

二、實驗要求

(一)數據準備

  • 生成或加載二分類數據集,使用 Scikit-learn 的make_classification創建含 20 維特征的 1000 樣本數據。
  • 劃分訓練集與測試集,初始比例為 7:3。

(二)MLE 參數估計

  • 假設特征服從高斯分布,手動計算各分類的均值、方差及先驗概率。
  • 推導后驗概率公式,實現基于 MLE 的樸素貝葉斯分類器。

(三)模型構建與對比

  • 手動實現:基于 MLE 參數的樸素貝葉斯分類器,對新樣本進行分類預測。
  • Scikit-learn 對比:使用GaussianNB內置模型,比較兩者的準確率、精確率、召回率及運行時間。

(四)性能分析

  • 調整測試集比例(0.2~0.5),觀察模型穩定性。
  • 改變特征數量(10~50),分析特征維度對模型性能的影響。

三、實驗原理

四、實驗步驟

(一)數據生成與預處理

import numpy as np  
from sklearn.datasets import make_classification  
# 生成二分類數據集  
X, y = make_classification(  n_samples=1000, n_features=20, n_classes=2, random_state=42  
)  
# 劃分訓練集與測試集(初始比例7:3)  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  

(二)手動實現 MLE 與樸素貝葉斯

class ManualNaiveBayes:  def fit(self, X, y):  self.classes = np.unique(y)  self.params = {}  for c in self.classes:  X_c = X[y == c]  self.params[c] = {  'mean': np.mean(X_c, axis=0),  # 均值  'var': np.var(X_c, axis=0),    # 方差  'prior': len(X_c) / len(X)     # 先驗概率  }  def predict(self, X):  posteriors = []  for c in self.classes:  prior = np.log(self.params[c]['prior'])  mean = self.params[c]['mean']  var = self.params[c]['var']  # 計算對數似然  likelihood = -0.5 * np.sum(np.log(2 * np.pi * var)) - 0.5 * np.sum(((X - mean)**2)/var, axis=1)  posterior = prior + likelihood  posteriors.append(posterior)  return self.classes[np.argmax(posteriors, axis=0)]  # 選擇后驗概率最大的類別  

(三)模型訓練與對比

from sklearn.naive_bayes import GaussianNB  
from sklearn.metrics import accuracy_score  # 手動模型訓練與預測  
manual_nb = ManualNaiveBayes()  
manual_nb.fit(X_train, y_train)  
y_pred_manual = manual_nb.predict(X_test)  # Scikit-learn模型訓練與預測  
sklearn_nb = GaussianNB()  
sklearn_nb.fit(X_train, y_train)  
y_pred_sklearn = sklearn_nb.predict(X_test)  # 性能指標計算  
print(f"手動實現準確率:{accuracy_score(y_test, y_pred_manual):.4f}")  
print(f"Sklearn實現準確率:{accuracy_score(y_test, y_pred_sklearn):.4f}")  

(四)參數調優與分析

  • 測試集比例影響:循環測試test_size=[0.2, 0.3, 0.4, 0.5],發現兩者準確率波動較小(手動實現約 0.69~0.71,Scikit-learn 約 0.70~0.72),但 Scikit-learn 在測試集比例較大時穩定性略優。
  • 特征數量影響:特征數從 10 增至 30 時,準確率上升(峰值約 0.73);超過 30 后因過擬合下降。手動實現運行時間隨特征數呈平方級增長,Scikit-learn 因底層優化增長緩慢。

(五)完整源代碼

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
import timeplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 數據加載與預處理
# 生成隨機二分類數據集
X, y = make_classification(n_samples=1000,  # 樣本數量n_features=20,  # 特征數量n_classes=2,  # 類別數量n_informative=15,  # 有信息量的特征數量n_redundant=3,  # 冗余特征數量n_repeated=2,  # 重復特征數量class_sep=0.5,  # 類別之間的分離程度random_state=42
)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 2. 手動實現MLE估計(樸素貝葉斯)
class ManualNaiveBayes:def fit(self, X, y):self.classes = np.unique(y)self.params = {}for c in self.classes:X_c = X[y == c]self.params[c] = {'mean': np.mean(X_c, axis=0),'var': np.var(X_c, axis=0),'prior': len(X_c) / len(X)}def predict(self, X):X = np.array(X)  # 確保輸入是numpy數組posteriors = []for c in self.classes:prior = np.log(self.params[c]['prior'])mean = self.params[c]['mean']var = self.params[c]['var']likelihood = -0.5 * np.sum(np.log(2 * np.pi * var)) - 0.5 * np.sum(((X - mean) ** 2) / var, axis=1)posterior = prior + likelihoodposteriors.append(posterior)return self.classes[np.argmax(posteriors, axis=0)]# 3. 使用sklearn的樸素貝葉斯對比
# 手動實現模型
manual_nb = ManualNaiveBayes()
start_time = time.time()
manual_nb.fit(X_train, y_train)
y_pred_manual = manual_nb.predict(X_test)
manual_time = time.time() - start_time# sklearn模型
sklearn_nb = GaussianNB()
start_time = time.time()
sklearn_nb.fit(X_train, y_train)
y_pred_sklearn = sklearn_nb.predict(X_test)
sklearn_time = time.time() - start_time# 4. 結果可視化輸出
# 繪制原始數據分布
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.title('原始數據分布')
plt.xlabel('特征1')
plt.ylabel('特征2')# 繪制手動實現模型的分類結果
plt.subplot(1, 3, 2)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_manual, edgecolors='k', marker='o')
plt.title('手動實現分類結果')
plt.xlabel('特征1')
plt.ylabel('特征2')# 繪制sklearn模型的分類結果
plt.subplot(1, 3, 3)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_sklearn, edgecolors='k', marker='o')
plt.title('sklearn分類結果')
plt.xlabel('特征1')
plt.ylabel('特征2')plt.tight_layout()
plt.show()# 5. 終端輸出性能指標
# 計算手動實現的模型性能指標
manual_acc = accuracy_score(y_test, y_pred_manual)
manual_pre = precision_score(y_test, y_pred_manual)
manual_rec = recall_score(y_test, y_pred_manual)# 計算sklearn模型性能指標
sklearn_acc = accuracy_score(y_test, y_pred_sklearn)
sklearn_pre = precision_score(y_test, y_pred_sklearn)
sklearn_rec = recall_score(y_test, y_pred_sklearn)print("手動實現的樸素貝葉斯分類器:")
print(f"準確率:{manual_acc:.4f}")
print(f"精確率:{manual_pre:.4f}")
print(f"召回率:{manual_rec:.4f}")
print(f"運行時間:{manual_time:.4f}秒")print("\n使用sklearn的高斯樸素貝葉斯分類器:")
print(f"準確率:{sklearn_acc:.4f}")
print(f"精確率:{sklearn_pre:.4f}")
print(f"召回率:{sklearn_rec:.4f}")
print(f"運行時間:{sklearn_time:.4f}秒")# 6. 不同訓練集/測試集比例下的性能指標變化分析
test_sizes = [0.2, 0.3, 0.4, 0.5]
manual_accs = []
sklearn_accs = []
manual_times = []
sklearn_times = []for test_size in test_sizes:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=42)# 手動實現模型manual_nb = ManualNaiveBayes()start_time = time.time()manual_nb.fit(X_train, y_train)y_pred_manual = manual_nb.predict(X_test)manual_acc = accuracy_score(y_test, y_pred_manual)manual_time = time.time() - start_timemanual_accs.append(manual_acc)manual_times.append(manual_time)# sklearn模型sklearn_nb = GaussianNB()start_time = time.time()sklearn_nb.fit(X_train, y_train)y_pred_sklearn = sklearn_nb.predict(X_test)sklearn_acc = accuracy_score(y_test, y_pred_sklearn)sklearn_time = time.time() - start_timesklearn_accs.append(sklearn_acc)sklearn_times.append(sklearn_time)# 繪制不同測試集比例下的準確率變化
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(test_sizes, manual_accs,color='red',marker='o',label='手動實現')
plt.plot(test_sizes, sklearn_accs,color='green', label='sklearn實現')
plt.xlabel('測試集比例')
plt.ylabel('準確率')
plt.title('不同測試集比例下的準確率變化')
plt.legend()
plt.grid(True)# 繪制不同測試集比例下的運行時間變化
plt.subplot(1, 2, 2)
plt.plot(test_sizes, manual_times, marker='o', label='手動實現')
plt.plot(test_sizes, sklearn_times, marker='o', label='sklearn實現')
plt.xlabel('測試集比例')
plt.ylabel('運行時間(秒)')
plt.title('不同測試集比例下的運行時間變化')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()

五、實驗結果

(一)基礎性能對比

模型類型準確率精確率召回率運行時間(秒)
手動實現(MLE)0.69670.72790.64710.0009
Scikit-learn0.69670.72790.64710.0020

(二)關鍵結論

  1. MLE 的有效性:手動實現成功通過 MLE 估計參數,驗證了樸素貝葉斯的分類邏輯,但細節優化不足(如未處理數值穩定性)。
  2. 庫函數優勢:Scikit-learn 的GaussianNB在相同準確率下更高效穩定,適合實際應用;手動實現適合學習算法原理。
  3. 特征與數據劃分:特征數適中(20~30 維)時模型最佳,過多需降維;測試集比例對結果影響較小,建議使用交叉驗證提升可靠性。

六、總結

? ?本次實驗通過手動實現 MLE 與樸素貝葉斯分類器,深入理解了參數估計的數學原理,并對比了 Scikit-learn 庫函數的性能。結果表明,MLE 是連接統計理論與機器學習的重要橋梁,而成熟庫函數在工程實踐中更具優勢。未來可進一步優化手動代碼(如向量化計算、正則化),或探索 MLE 在其他模型(如邏輯回歸)中的應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82421.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南 一、創建隔離開發環境 1. 使用虛擬環境(推薦venv) # 在項目目錄打開終端執行 python -m venv douban_env # 創建虛擬環境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

STM32八股【11】-----Linux Bootloader (U-Boot)

參考U-Boot U-Boot是什么 嵌入式Linux系統需要一個bootloader來加載系統 U-boot就是一個通用開源的嵌入式Linux bootloader 主要實現的功能: 初始化硬件資源(如內存、串口、存儲器等)從存儲介質加載Linux內核到內存中傳遞啟動參數給內核啟…

【設計模式】責任鏈+模板+工程模式使用模板

前言 方便寫出優雅,解耦,高內聚,高復用的代碼。 Demo // 1. 定義驗證器接口(責任鏈模式) public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 創建抽象驗證器&am…

Unity3D仿星露谷物語開發49之創建云杉樹

1、目標 創建一顆既可以生長又可以砍伐的云杉樹,這個和之前創建橡樹類似。 2、創建云杉樹預制體 創建新物體命名為CropTreeBlueSpruce,并且添加Box Collider 2D和Crop組件。 在CropTreeBlueSpruce下創建子物體命名為CropSprite,添加3個組件…

【C#】消息隊列的使用

在C#中使用消息隊列,通常是指使用微軟的Message Queuing (MSMQ)技術。MSMQ提供了一種異步通信協議,允許應用程序通過暫時存儲要發送到目的地的消息來相互通信。 安裝MSMQ 首先,確保你的開發機器和部署服務器上都安裝了MSMQ。可以通過“控制…

IP-guard發布新版本4.87.2241.0

IP-guard發布新版本4.87.2241.0 新版本下載地址: https://www.tec-development.com/down/IPguard/Release/V4/IPguard4.87.2241.0.zip?s=901D45ADB22CBBFE5C612DC40AFD6BFB1551A9CD54EF418D5E86BBD256813867 新版本升級地址:

【Linux 服務器磁盤映像備份與恢復實戰指南】虛擬機備份,物理機上云都可以用這套方案!

Linux 服務器磁盤映像備份與恢復實戰指南 背景 在服務器運維中,磁盤健康度下降可能導致數據丟失風險,特別是在未配置 RAID 的情況下。針對這種情況,備份磁盤數據并恢復到新設備是確保數據安全的關鍵。本文記錄了使用 dd 命令通過 NFS 實現全…

深入理解 Linux 的 set、env 和 printenv 命令

在 Linux 和類 Unix 系統中,環境變量是配置和管理 Shell 及進程行為的核心機制。set、env 和 printenv 是與環境變量交互的三個重要命令,每個命令都有其獨特的功能和用途。本文將詳細探討這三個命令的區別,幫助大家更好地理解和使用這些命令。…

icexmoon-tree

icexmoon-tree 一個輕量級的 Java 工具庫&#xff0c;提供樹形結構操作功能。 安裝 <dependency><groupId>cn.icexmoon</groupId><artifactId>icexmoon-tree</artifactId><version>1.0.0</version> </dependency>使用 構建…

機器學習在智能水泥基復合材料中的應用與實踐

“機器學習在智能水泥基復合材料中的應用與實踐” 課程 內容 機器學習基礎模型與復合材料研究融合 機器學習在復合材料中的應用概述機器學習用于復合材料研究的流程復合材料數據收集與數據預處理 實例&#xff1a;數據的收集和預處理 復合材料機器學習特征工程與選擇 實例&a…

微軟 Build 2025:開啟 AI 智能體時代的產業革命

在 2025 年 5 月 19 日的微軟 Build 開發者大會上&#xff0c;薩提亞?納德拉以 "我們已進入 AI 智能體時代" 的宣言&#xff0c;正式拉開了人工智能發展的新紀元。這場匯聚了奧特曼、黃仁勛、馬斯克三位科技領袖的盛會&#xff0c;不僅發布了 50 余項創新產品&#…

[Java惡補day6] 15. 三數之和

給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 示例 1&a…

《黃帝內經》數學建模與形式化表征方式的重構

黃帝內經的數學概括&#xff1a;《黃帝內經》數學建模與形式化表征方式的重構 摘要&#xff1a;《黃帝內經》通過現代數學理論如動力系統、代數拓撲和隨機過程&#xff0c;被重構為一個形式化的人體健康模型。該模型包括陰陽動力學的微分幾何、五行代數的李群結構、經絡拓撲與同…

理論篇五:如何優化Webpack的打包速度

優化 Webpack 打包速度是提升前端開發效率的關鍵。以下是 10 種核心優化策略,涵蓋開發和生產環境,附帶具體配置和實測效果對比: 一、縮小文件搜索范圍 1. 指定解析路徑(Resolve) resolve: {extensions: [.js, .jsx],

[Windows] 游戲常用運行庫- Game Runtime Libraries Package(6.2.25.0409)

游戲常用運行庫 合集 整合了許多游戲會用到的運行庫&#xff0c;支持 Windows XP – Windows 11 系統&#xff0c;并且支持自動檢測系統勾選推薦的運行庫&#xff0c;方便快捷。 本版特點&#xff1a; By&#xff1a;mefcl 整合常見最新游戲所需運行庫 根據系統自動勾選推薦…

JDK8中的 Stream流式編程用法優化(工具類在文章最后)

Java從JDK8起提供了Stream流這個功能&#xff0c;于是項目里出現了大量基于Stream流的寫法。隨著項目的進行&#xff0c;慢慢的代碼中鋪天蓋地的都是下面的寫法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

uni-app學習筆記十二-vue3中組件傳值(對象傳值)

一.單對象傳值 父組件定義對象的值 <template><view><UserInfo :obj"userinfo"></UserInfo></view> </template><script setup>import {ref} from "vue"const userinfo ref({name:"蛛兒",avatar:&…

UV-python環境管理工具 入門教程

在學習使用 MCP 的時候接觸到了 UV 這個環境管理工具&#xff0c;經過對比&#xff0c;發現它在諸多方面比 venv、conda 等工具更為出色&#xff0c;因此整理了這份簡單的入門學習筆記&#xff0c;希望能幫助大家快速上手。 介紹 UV 是一款集 Python 版本管理、虛擬環境創建與…

【漫話機器學習系列】277.梯度裁剪(Gradient Clipping)

【深度學習】什么是梯度裁剪&#xff08;Gradient Clipping&#xff09;&#xff1f;一張圖徹底搞懂&#xff01; 在訓練深度神經網絡&#xff0c;尤其是 RNN、LSTM、Transformer 這類深層結構時&#xff0c;你是否遇到過以下情況&#xff1a; 模型 loss 突然變成 NaN&#xf…

零基礎弄懂 ngx_http_slice_module分片緩存加速

一、為什么需要 Slice&#xff1f; 在 NGINX 反向代理或 CDN 場景中&#xff0c;大文件&#xff08;視頻、軟件包、鏡像等&#xff09;常因單體體積過大而令緩存命中率低、回源代價高。 ngx_http_slice_module 通過把一次完整響應拆分成 固定大小的字節塊&#xff08;Slice&am…