機器學習 樸素貝葉斯

目錄

一.什么是樸素貝葉斯

1.1 從 “概率” 到 “分類”

二.樸素貝葉斯的數學基礎:貝葉斯定理

2.1 貝葉斯定理公式

2.2 從貝葉斯定理到樸素貝葉斯分類

2.3 “樸素” 的關鍵:特征獨立性假設

三、樸素貝葉斯的三種常見類型

3.1 高斯樸素貝葉斯(Gaussian Naive Bayes)

3.2 多項式樸素貝葉斯(Multinomial Naive Bayes)

3.3 伯努利樸素貝葉斯(Bernoulli Naive Bayes)

四、樸素貝葉斯的工作流程

步驟 1:數據準備與預處理

步驟 2:計算先驗概率P(C)

步驟 3:計算似然概率P(x_i|C)

步驟 4:預測新樣本

五、樸素貝葉斯的優缺點

優點:

缺點:

改進方向:

六、樸素貝葉斯的經典應用場景

1. 文本分類

2. 推薦系統

3. 醫療診斷

4. 欺詐檢測

七.案例實訓

1.鳶尾花分類

2.數字識別


一.什么是樸素貝葉斯

樸素貝葉斯是一種基于貝葉斯定理特征獨立性假設分類算法。它的核心思想是:通過已知的 “先驗概率”,結合數據特征計算 “后驗概率”,最終以 “后驗概率” 最大的類別作為預測結果。

1.1 從 “概率” 到 “分類”

生活中充滿了概率決策的場景:比如看到烏云密布(特征),我們會判斷 “下雨(類別)的概率更高”;收到一封含 “優惠”“點擊鏈接” 的郵件(特征),我們會推測 “這是垃圾郵件(類別)的概率更高”。樸素貝葉斯做的正是類似的事 —— 通過特征推斷類別,本質是概率驅動的分類

它的 “樸素” 體現在對特征的假設上:假設所有特征之間相互獨立。這個假設雖然簡化了計算,但在實際場景中(比如文本分類)往往能得到不錯的結果,這也是它 “樸素卻實用” 的原因。

二.樸素貝葉斯的數學基礎:貝葉斯定理

2.1 貝葉斯定理公式

貝葉斯定理的數學表達式如下: P(A|B) = P(B|A)P(A)/P(B)

其中:

  • P(A|B):后驗概率,指在已知 “事件 B 發生” 的條件下,“事件 A 發生” 的概率(這是我們最終要計算的目標);
  • P(B|A):似然概率,指在 “事件 A 發生” 的條件下,“事件 B 發生” 的概率;
  • P(A):先驗概率,指 “事件 A 發生” 的概率(在沒有任何證據時,對 A 的初始信念);
  • P(B):邊緣概率,指 “事件 B 發生” 的概率(作為歸一化常數,不影響類別判斷的相對大小)。

2.2 從貝葉斯定理到樸素貝葉斯分類

在分類問題中,我們需要用特征推測類別。假設輸入特征為X=(x_1, x_2, ..., x_n)(比如郵件中的關鍵詞),類別為C(比如 “垃圾郵件” 或 “正常郵件”),則樸素貝葉斯的核心公式可改寫為:

P(C∣X)=P(X∣C)/P(C)/p(X)?

其中:

  • P(C|X):后驗概率,即 “已知特征 X 時,屬于類別 C 的概率”(我們要最大化的目標);
  • P(C):先驗概率,即 “類別 C 在所有數據中出現的概率”(比如垃圾郵件占總郵件的比例);
  • P(X|C):似然概率,即 “在類別 C 中,特征 X 出現的概率”(比如垃圾郵件中出現 “優惠” 關鍵詞的概率);
  • (P(X):邊緣概率,對所有類別都相同,計算時可忽略。

2.3 “樸素” 的關鍵:特征獨立性假設

直接計算P(X|C)并不容易,因為特征X可能有多個維度(比如文本有多個關鍵詞)。樸素貝葉斯通過 “特征獨立性假設” 簡化計算:假設特征(x_1, x_2, ..., x_n)相互獨立,則:

P(X|C) = P(x_1|C)P(x_2|C)...P(x_n|C)

即 “聯合概率等于邊緣概率的乘積”。這個假設大幅降低了計算復雜度,讓樸素貝葉斯能高效處理高維數據(比如文本的詞向量)。

三、樸素貝葉斯的三種常見類型

根據特征數據的類型不同,樸素貝葉斯衍生出了三種常用模型,分別適用于不同場景:

3.1 高斯樸素貝葉斯(Gaussian Naive Bayes)

適用場景:特征是連續型數據(如身高、體重、鳶尾花的花瓣長度)。 核心思想:假設在每個類別下,特征服從高斯分布(正態分布)。即對于類別C和特征(x_i),P(x_i|C)服從高斯分布(N(\mu_{C,i}, \sigma^2_{C,i})\),其中\(\mu\)是均值,\(\sigma^2\)是方差。

計算時,先通過訓練數據計算每個類別下各特征的均值和方差,再用高斯概率密度函數計算\(P(x_i|C)\)。

3.2 多項式樸素貝葉斯(Multinomial Naive Bayes)

適用場景:特征是離散計數數據(如文本中詞的出現次數、商品的點擊次數)。 核心思想:假設特征的分布服從多項式分布。例如在文本分類中,特征是 “詞頻”,則\(P(x_i|C)\)表示 “在類別C的文檔中,第i個詞出現的概率”。

為了避免 “零概率問題”(某個詞在類別C中從未出現過,導致\(P(x_i|C)=0\),乘積結果為 0),通常會使用拉普拉斯平滑(Laplace Smoothing),公式為: \(P(x_i|C) = \frac{count(x_i, C) + 1}{count(C) + n}\) 其中\(count(x_i, C)\)是特征\(x_i\)在類別C中的計數,\(count(C)\)是類別C的總計數,n是特征總數。

3.3 伯努利樸素貝葉斯(Bernoulli Naive Bayes)

適用場景:特征是二進制數據(0 或 1,如文本中詞是否出現、用戶是否點擊某個按鈕)。 核心思想:假設特征服從伯努利分布(即只有 “出現” 或 “不出現” 兩種狀態)。例如在文本分類中,特征是 “詞是否存在”(1 表示存在,0 表示不存在),則\(P(x_i|C)\)是 “類別C中詞i出現的概率”。

它同樣會使用拉普拉斯平滑處理零概率問題,且更關注 “特征是否出現” 而非 “出現次數”,適合短文本場景。

四、樸素貝葉斯的工作流程

樸素貝葉斯的訓練和預測流程非常簡潔,核心是 “統計概率” 和 “計算后驗”,具體步驟如下:

步驟 1:數據準備與預處理

  • 收集帶標簽的訓練數據(特征X?+ 類別C);
  • 對特征進行預處理:連續特征歸一化(高斯樸素貝葉斯)、離散特征編碼(多項式 / 伯努利)。

步驟 2:計算先驗概率P(C)

  • 統計每個類別在訓練集中的占比:P(C) = 類別C的樣本數 / 總樣本數。

步驟 3:計算似然概率P(x_i|C)

  • 根據特征類型選擇模型(高斯 / 多項式 / 伯努利),統計每個類別下各特征的概率分布:
    • 高斯模型:計算每個類別下特征的均值和方差;
    • 多項式 / 伯努利模型:統計特征在類別中的計數,并用平滑處理零概率。

步驟 4:預測新樣本

  • 對新樣本的特征X=(x_1, x_2, ..., x_n),計算每個類別的后驗概率P(C|X)?
  • 選擇后驗概率最大的類別作為預測結果。

五、樸素貝葉斯的優缺點

優點:

  1. 計算高效:訓練時只需統計概率,預測時是簡單的乘法運算,時間復雜度低,適合大規模數據;
  2. 適合高維數據:對文本等稀疏高維特征友好,無需降維也能表現良好;
  3. 數據需求少:少量樣本即可訓練(尤其先驗概率已知時);
  4. 可解釋性強:結果可通過概率解釋,比如 “該郵件是垃圾郵件的概率為 92%”。

缺點:

  1. 特征獨立性假設局限:實際中特征往往不獨立(比如 “暴雨” 和 “洪水” 相關),可能影響精度;
  2. 特征分布敏感:若實際分布與假設分布(如高斯分布)偏差大,效果會下降;
  3. 難以學習特征間的交互關系:無法捕捉 “特征 A 且特征 B” 的聯合影響。

改進方向:

  • 半樸素貝葉斯:放松獨立性假設,允許部分特征相關(如通過 “特征選擇” 保留重要關聯);
  • 核函數擴展:對非獨立特征用核函數映射到高維空間,間接捕捉關聯。

六、樸素貝葉斯的經典應用場景

樸素貝葉斯憑借高效和實用性,在多個領域大放異彩:

1. 文本分類

  • 場景:垃圾郵件過濾、新聞主題分類(科技 / 娛樂)、情感分析(正面 / 負面評價);
  • 原理:將文本拆分為詞袋特征,用多項式 / 伯努利樸素貝葉斯計算 “詞特征屬于某類別的概率”。

2. 推薦系統

  • 場景:基于用戶歷史行為推薦商品 / 電影;
  • 原理:用用戶特征(年齡、性別)和物品特征(類型、價格)預測 “用戶喜歡該物品的概率”。

3. 醫療診斷

  • 場景:根據癥狀(特征)判斷患病類型(類別);
  • 原理:結合醫學先驗知識(疾病發病率\(P(C)\))和癥狀概率\(P(癥狀|疾病)\)做推斷。

4. 欺詐檢測

  • 場景:信用卡盜刷、交易欺詐識別;
  • 原理:通過交易金額、地點、時間等特征,計算 “該交易為欺詐的概率”。

七.案例實訓

1.鳶尾花分類

數據內容如下

完整代碼如下:

需要注意我們可以將訓練內容無關的第一列內容樣本號刪除

# 鳶尾花分類
from sklearn import metrics
from sklearn.naive_bayes import MultinomialNB
import pandas as pd
data = pd.read_excel('鳶尾花測試數據.xlsx')
data=data.drop('樣本',axis=1)
X=data.iloc[:,:-1]
y=data.iloc[:,-1]ml=MultinomialNB()
ml.fit(X,y)
predicted=ml.predict(X)
print(ml.score(X,y))
print(metrics.classification_report(y,predicted))

2.數字識別

我們可以使用sklearn中自帶的數據集,這里我們用自帶的數據集load_digits完成手寫數字識別

完整代碼如下

# 手寫數字識別分類
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
digits=load_digits()
X=digits.data
y=digits.target
train_x,test_x,train_y,test_y=train_test_split(X,y,test_size=0.3,random_state=0)
ml.fit(train_x,train_y)
print('===============自測報告==============')
self_predicted=ml.predict(train_x)
print(metrics.classification_report(train_y,self_predicted))
print('===============測試報告==============')
test_predicted=ml.predict(test_x)
print(metrics.classification_report(test_y,test_predicted))===============自測報告==============precision    recall  f1-score   support0       1.00      0.98      0.99       1331       0.88      0.76      0.82       1302       0.92      0.90      0.91       1243       0.99      0.88      0.93       1294       0.96      0.96      0.96       1335       0.98      0.87      0.92       1256       0.98      0.97      0.97       1217       0.91      0.98      0.94       1268       0.73      0.88      0.80       1139       0.77      0.87      0.82       123accuracy                           0.91      1257macro avg       0.91      0.91      0.91      1257
weighted avg       0.91      0.91      0.91      1257===============測試報告==============precision    recall  f1-score   support0       0.98      0.98      0.98        451       0.88      0.81      0.84        522       0.94      0.87      0.90        533       1.00      0.81      0.90        544       0.96      0.96      0.96        485       0.98      0.82      0.90        576       0.97      1.00      0.98        607       0.88      0.98      0.93        538       0.89      0.90      0.89        619       0.71      0.93      0.80        57accuracy                           0.91       540macro avg       0.92      0.91      0.91       540
weighted avg       0.92      0.91      0.91       540

????????

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

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

相關文章

A Logical Calculus of the Ideas Immanent in Nervous Activity(神經網絡早期的M-P模型)

哈嘍,各位朋友大家上午好!今天我們要一起啃下這篇神經科學與邏輯學交叉領域的奠基之作——McCulloch和Pitts的《A Logical Calculus of the Ideas Immanent in Nervous Activity》。這篇論文篇幅不長,但每一個定理、每一個假設都像精密齒輪&a…

大語言模型提示工程與應用:提示工程-提升模型準確性與減少偏見的方法

語言模型可靠性優化 學習目標 在本課程中,我們將學習通過提示工程提升模型事實準確性、減少偏見的有效方法。 相關知識點 語言模型可靠性優化 學習內容 1 語言模型可靠性優化 1.1 事實準確性增強 LLM可能生成看似合理但實際虛構的內容。優化策略包括&#x…

遇到前端導出 Excel 文件出現亂碼或文件損壞的問題

1. 檢查后端返回的數據格式確認接口響應:確保后端返回的是二進制流(如 ArrayBuffer)或 Base64 編碼的 Excel 文件,而非 JSON 字符串。用瀏覽器開發者工具(Network 標簽)檢查接口響應類型:正確的…

2025年Cloudflare WAF防護機制深度剖析:5秒盾繞過完全指南

2025年Cloudflare WAF防護機制深度剖析:5秒盾繞過完全指南 技術概述 Cloudflare作為全球領先的CDN和網絡安全服務提供商,其WAF(Web Application Firewall)防護系統已經成為現代Web安全的標桿。特別是其標志性的"5秒盾"…

【Android調用相冊、拍照、錄像】等功能的封裝

關于調用Android項目 關于Android中調用相機拍照、錄像,調用相冊選圖等是比較繁瑣的,為了減少代碼冗余,肯定需要封裝成工具類,最終使用大概如下,大部分代碼使用Java編寫,因為需要照顧到不適用kotlin的伸手…

Git 分支管理:從新開發分支遷移為主分支的完整指南

問題背景 我在使用 Git 進行開發時,由于原有的主分支遭到了污染,不得已在多方嘗試之后,決定替換原有的主分支。創建一個新分支并完成了重要修改: 基于提交 0fcb6df0f5e8caa3d853bb1f43f23cfe6d269b18 創建了 new-development 分支…

nginx常見問題(四):端口無權限

當 Nginx 日志報錯 bind() to 80 failed (13: Permission denied) 時,這通常是由于權限不足導致 Nginx 無法綁定到 80 端口(該端口為系統特權端口)。以下是詳細的問題分析與解決方案:一、問題原因分析80 端口屬于 系統特權端口&am…

【線性代數】線性方程組與矩陣——(3)線性方程組解的結構

上一節:【線性代數】線性方程組與矩陣——(2)矩陣與線性方程組的解 總目錄:【線性代數】目錄 文章目錄9. 向量組的線性相關性與線性方程組解的結構9.1. 向量組及其線性組合9.2. 向量組的線性相關性9.3. 向量組的秩9.4. 線性方程組…

機器學習-----K-means算法介紹

一、為什么需要 K-Means?在監督學習中,我們總把數據寫成 (x, y),讓模型學習 x → y 的映射。 但現實中很多數據根本沒有標簽 y,例如:啤酒:熱量、鈉含量、酒精度、價格用戶:訪問時長、點擊次數、…

Spring Security自動處理/login請求,后端控制層沒有 @PostMapping(“/login“) 這樣的 Controller 方法

一:前言 (1)Spring Security概念: Spring Security 是屬于 Spring 生態下一個功能強大且高度可定制的認證和授權框架,它不僅限于 Web 應用程序的安全性,也可以用于保護任何類型的應用程序。 &#xff08…

idea開發工具中git如何忽略編譯文件build、gradle的文件?

idea開發工具中: git顯示下面這個文件有變更: ~/Documents/wwwroot-dev/wlxl-backend/java/hyh-apis/hyh-apis-springboot/build/resources/main/mapping/AccountRealnameMapper.xml 我git的根路徑是: ~/Documents/wwwroot-dev/wlxl-backend/…

狀態機淺析

狀態機是處理狀態依賴型行為的高效工具,通過結構化建模狀態轉換,解決了傳統條件判斷的冗余和混亂問題。它在設備控制、流程管理、協議解析等場景中表現優異,核心優勢在于邏輯清晰、可擴展性強和易于調試。 一、介紹 1. 概念 狀態機&#x…

Windows 手動病毒排查指南:不依賴殺毒軟件的系統安全防護

Windows 手動病毒排查指南:不依賴殺毒軟件的系統安全防護 在數字時代,電腦病毒就像潛伏的"網絡幽靈",從竊取隱私的木馬到消耗資源的蠕蟲,時刻威脅著系統安全。當殺毒軟件失效或遭遇新型威脅時,手動排查病毒便…

GPT-5 is here

GPT-5 is here https://openai.com/index/introducing-gpt-5/ — and it’s #1 across the board! #1 in Text, WebDev, and Vision Arena #1 in Hard Prompts, Coding, Math, Creativity, Long Queries, and more Tested under the codename “summit”, GPT-5 now holds the …

【華為機試】55. 跳躍游戲

文章目錄55. 跳躍游戲題目描述示例 1:示例 2:提示:解題思路一、問題本質與建模二、方法總覽與選擇三、貪心算法的正確性(直觀解釋 循環不變式)四、反向貪心:等價但有啟發的視角五、與動態規劃的對比與誤區…

RabbitMQ面試精講 Day 18:內存與磁盤優化配置

【RabbitMQ面試精講 Day 18】內存與磁盤優化配置 開篇:內存與磁盤優化的重要性 歡迎來到"RabbitMQ面試精講"系列的第18天!今天我們將深入探討RabbitMQ的內存與磁盤優化配置,這是面試中經常被問及的高頻主題,也是生產環…

【C++】string 的特性和使用

Ciallo&#xff5e; (∠?ω< )⌒★ string&#xff08;1&#xff09;1. 構造函數1.1 string();1.2 string(const char* s);1.3 string(const string& str);1.4 string(size_t n, char c);1.5 string(const string& str, size_t pos, size_t len npos);1.6 string(…

創始人IP的精神修煉:于成長中積蓄力量

IP 經濟席卷之下&#xff0c;眾多企業家常被 “是否入局 IP”“能否做好 IP” 的焦慮裹挾。這種潛藏的精神內耗&#xff0c;對企業根基的侵蝕往往勝過業績的起伏。著名文化學者于丹在全球創始人 IP 領袖高峰論壇上的洞見&#xff0c;為創始人 IP 的精神成長照亮了前路&#xff…

gbase8s數據庫中對象元數據查詢

最近整理了gbase8s數據庫中常見的元數據的查詢&#xff0c;包括表、視圖、序列、包、類型、觸發器、plsql等等&#xff0c;僅供參考。set environment sqlmode oracle; drop package DBMS_METADATA; create or replace package DBMS_METADATA is function GET_DDL(objtype varc…

常用hook鉤子函數

爬蟲Hook技術常用字段和勾子函數 目錄 Hook技術概述網絡請求相關Hook瀏覽器環境HookJavaScript引擎Hook加密算法Hook反爬蟲檢測Hook實際應用示例Hook工具和框架 Hook技術概述 Hook&#xff08;鉤子&#xff09;技術是一種在程序運行時攔截和修改函數調用的技術。在爬蟲中&a…