后驗概率最大化(MAP)估計算法原理以及相具體的應用實例附C++代碼示例

1. MAP估計基本原理

MAP(Maximum A Posteriori,最大后驗概率估計)是貝葉斯推斷中的重要概念,它的目標是:

給定觀測數據,找到使得后驗概率最大的參數值。

公式化表示:
[ θ MAP = arg ? max ? θ P ( θ ∣ x ) ] [ \theta_{\text{MAP}} = \arg\max_{\theta} P(\theta | x) ] [θMAP?=argθmax?P(θx)]
其中:

  • ( θ ) ( \theta ) (θ) 是我們要估計的參數,
  • ( x ) ( x ) (x) 是觀測數據,
  • ( P ( θ ∣ x ) ) ( P(\theta | x) ) (P(θx)) 是參數在觀測數據下的后驗概率。

利用貝葉斯公式展開:
[ P ( θ ∣ x ) = P ( x ∣ θ ) P ( θ ) P ( x ) ] [ P(\theta | x) = \frac{P(x|\theta) P(\theta)}{P(x)} ] [P(θx)=P(x)P(xθ)P(θ)?]
其中:

  • ( P ( x ∣ θ ) ) ( P(x|\theta) ) (P(xθ)) 是似然(likelihood),
  • ( P ( θ ) ) ( P(\theta) ) (P(θ)) 是先驗(prior),
  • ( P ( x ) ) ( P(x) ) (P(x)) 是證據(evidence),與參數無關,可忽略在優化中。

所以 MAP 估計可以等價為最大化:
[ θ MAP = arg ? max ? θ P ( x ∣ θ ) P ( θ ) ] [ \theta_{\text{MAP}} = \arg\max_{\theta} P(x|\theta) P(\theta) ] [θMAP?=argθmax?P(xθ)P(θ)]
也可以取對數(為了數值穩定和方便求導):
[ θ MAP = arg ? max ? θ ( log ? P ( x ∣ θ ) + log ? P ( θ ) ) ] [ \theta_{\text{MAP}} = \arg\max_{\theta} \left( \log P(x|\theta) + \log P(\theta) \right) ] [θMAP?=argθmax?(logP(xθ)+logP(θ))]
總結:

  • MLE(最大似然估計)只最大化 ( P ( x ∣ θ ) ) ( P(x|\theta) ) (P(xθ))不考慮先驗
  • MAP 估計既考慮似然 ( P ( x ∣ θ ) ) ( P(x|\theta) ) (P(xθ)),又考慮先驗 ( P ( θ ) ) ( P(\theta) ) (P(θ))

2. MAP推導示例 —— 估計正態分布均值

假設觀測數據集 ( x = { x 1 , x 2 , . . . , x N } ) ( x = \{x_1, x_2, ..., x_N\} ) (x={x1?,x2?,...,xN?}) 是從均值為 ( μ ) ( \mu ) (μ)、方差為已知 ( σ 2 ) ( \sigma^2 ) (σ2) 的正態分布中采樣得到的。
我們要用 MAP 估計 ( μ ) ( \mu ) (μ)

  • 似然函數(假設獨立同分布):
    [ P ( x ∣ μ ) = ∏ i = 1 N 1 2 π σ 2 exp ? ( ? ( x i ? μ ) 2 2 σ 2 ) ] [ P(x|\mu) = \prod_{i=1}^N \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left( -\frac{(x_i-\mu)^2}{2\sigma^2} \right) ] [P(xμ)=i=1N?2πσ2 ?1?exp(?2σ2(xi??μ)2?)]
    取對數似然:
    [ log ? P ( x ∣ μ ) = ? N 2 log ? ( 2 π σ 2 ) ? 1 2 σ 2 ∑ i = 1 N ( x i ? μ ) 2 ] [ \log P(x|\mu) = -\frac{N}{2} \log(2\pi\sigma^2) - \frac{1}{2\sigma^2} \sum_{i=1}^N (x_i-\mu)^2 ] [logP(xμ)=?2N?log(2πσ2)?2σ21?i=1N?(xi??μ)2]
  • 假設先驗 ( μ ~ N ( μ 0 , σ 0 2 ) ) ( \mu \sim \mathcal{N}(\mu_0, \sigma_0^2) ) (μN(μ0?,σ02?)),即:
    [ P ( μ ) = 1 2 π σ 0 2 exp ? ( ? ( μ ? μ 0 ) 2 2 σ 0 2 ) ] [ P(\mu) = \frac{1}{\sqrt{2\pi\sigma_0^2}} \exp\left( -\frac{(\mu-\mu_0)^2}{2\sigma_0^2} \right) ] [P(μ)=2πσ02? ?1?exp(?2σ02?(μ?μ0?)2?)]
    取對數先驗:
    [ log ? P ( μ ) = ? 1 2 log ? ( 2 π σ 0 2 ) ? ( μ ? μ 0 ) 2 2 σ 0 2 ] [ \log P(\mu) = -\frac{1}{2} \log(2\pi\sigma_0^2) - \frac{(\mu-\mu_0)^2}{2\sigma_0^2} ] [logP(μ)=?21?log(2πσ02?)?2σ02?(μ?μ0?)2?]
  • 總目標:
    [ θ MAP = arg ? max ? μ ( log ? P ( x ∣ μ ) + log ? P ( μ ) ) ] [ \theta_{\text{MAP}} = \arg\max_{\mu} \left( \log P(x|\mu) + \log P(\mu) \right) ] [θMAP?=argμmax?(logP(xμ)+logP(μ))]
    去掉無關常數后,最大化:
    [ ? 1 2 σ 2 ∑ i = 1 N ( x i ? μ ) 2 ? 1 2 σ 0 2 ( μ ? μ 0 ) 2 ] [ -\frac{1}{2\sigma^2} \sum_{i=1}^N (x_i-\mu)^2 - \frac{1}{2\sigma_0^2} (\mu-\mu_0)^2 ] [?2σ21?i=1N?(xi??μ)2?2σ02?1?(μ?μ0?)2]
    即最小化:
    [ ∑ i = 1 N ( x i ? μ ) 2 + σ 2 σ 0 2 ( μ ? μ 0 ) 2 ] [ \sum_{i=1}^N (x_i-\mu)^2 + \frac{\sigma^2}{\sigma_0^2} (\mu-\mu_0)^2 ] [i=1N?(xi??μ)2+σ02?σ2?(μ?μ0?)2]
    展開、對 ( μ ) ( \mu ) (μ) 求導并令導數為零,得到:
    [ μ MAP = σ 0 2 ∑ i = 1 N x i + σ 2 μ 0 N σ 0 2 + σ 2 ] [ \mu_{\text{MAP}} = \frac{\sigma_0^2 \sum_{i=1}^N x_i + \sigma^2 \mu_0}{N\sigma_0^2 + \sigma^2} ] [μMAP?=Nσ02?+σ2σ02?i=1N?xi?+σ2μ0??]
    直觀理解:
  • 當先驗方差 ( σ 0 2 ) ( \sigma_0^2 ) (σ02?) 很大時,先驗很弱,MAP 估計趨近于 MLE(樣本均值)。
  • 當先驗方差小,先驗很強,結果更接近先驗均值 ( μ 0 ) ( \mu_0 ) (μ0?)

3. MAP應用實例

常見的 MAP 應用領域包括:

  • SLAM后端優化(g2o, GTSAM):地圖和軌跡估計通常是 MAP 問題。
  • 機器學習(L2正則化):加了正則項的回歸可解釋為 MAP。
  • 信號處理:濾波器設計中有 MAP估計噪聲。
  • 計算機視覺:圖像配準、姿態估計等。
  • NLP生成模型:文本生成時選概率最大的輸出。

4. C++代碼示例 —— 正態分布均值的MAP估計

下面給出簡單的 C++ 代碼示例:

#include <iostream>
#include <vector>
#include <numeric> // std::accumulate// 計算均值
double compute_mean(const std::vector<double>& data) {return std::accumulate(data.begin(), data.end(), 0.0) / data.size();
}// MAP估計
double map_estimate(const std::vector<double>& data, double sigma2, double mu0, double sigma0_2) {double N = static_cast<double>(data.size());double sum_x = std::accumulate(data.begin(), data.end(), 0.0);double numerator = sigma0_2 * sum_x + sigma2 * mu0;double denominator = N * sigma0_2 + sigma2;return numerator / denominator;
}int main() {// 觀測數據std::vector<double> x = {1.2, 1.8, 2.0, 1.5, 2.2};// 已知觀測噪聲方差double sigma2 = 0.1;// 先驗均值和方差double mu0 = 2.0;double sigma0_2 = 0.5;double mu_map = map_estimate(x, sigma2, mu0, sigma0_2);std::cout << "MAP估計的均值為: " << mu_map << std::endl;return 0;
}

輸出示例:

MAP估計的均值為: 1.87321

總結一句話

MAP估計 = 在最大似然上加上先驗知識,讓推斷更加魯棒。


5. MAP下擬合直線示例:推導

假設我們有 ( N ) ( N ) (N) 個觀測點 ( ( x i , y i ) ) ( (x_i, y_i) ) ((xi?,yi?)),我們想擬合一條直線:
[ y = a x + b ] [ y = ax + b ] [y=ax+b]
其中參數 ( a , b ) ( a, b ) (a,b) 是我們要估計的。

  • 似然模型(假設觀測有高斯噪聲):
    [ y i = a x i + b + ? i , ? i ~ N ( 0 , σ 2 ) ] [ y_i = a x_i + b + \epsilon_i, \quad \epsilon_i \sim \mathcal{N}(0, \sigma^2) ] [yi?=axi?+b+?i?,?i?N(0,σ2)]
    所以似然為:
    [ P ( y i ∣ x i , a , b ) ∝ exp ? ( ? ( y i ? ( a x i + b ) ) 2 2 σ 2 ) ] [ P(y_i|x_i, a, b) \propto \exp\left( -\frac{(y_i - (a x_i + b))^2}{2\sigma^2} \right) ] [P(yi?xi?,a,b)exp(?2σ2(yi??(axi?+b))2?)]
  • 先驗模型
    假設我們對 ( a ) ( a ) (a) ( b ) ( b ) (b) 有正則化先驗(例如,偏好較小的斜率和截距):
    [ P ( a , b ) ∝ exp ? ( ? λ 2 ( a 2 + b 2 ) ) ] [ P(a, b) \propto \exp\left( -\frac{\lambda}{2} (a^2 + b^2) \right) ] [P(a,b)exp(?2λ?(a2+b2))]
  • MAP目標函數(取負對數,變成最小化問題):
    [ Cost ( a , b ) = ∑ i = 1 N ( y i ? ( a x i + b ) ) 2 + λ ( a 2 + b 2 ) ] [ \text{Cost}(a, b) = \sum_{i=1}^N (y_i - (a x_i + b))^2 + \lambda (a^2 + b^2) ] [Cost(a,b)=i=1N?(yi??(axi?+b))2+λ(a2+b2)]
    就是常規的最小二乘項 + 正則項!
    這個目標就是典型的帶L2正則化的線性回歸(也叫Ridge Regression)。

6. 用Eigen實現完整C++版

下面給你完整示例,包括矩陣推導、解法、繪圖。

基于Eigen的 C++代碼示例

#include <iostream>
#include <vector>
#include <Eigen/Dense>// 用于生成一些模擬數據
void generate_data(std::vector<double>& xs, std::vector<double>& ys, double true_a, double true_b, double noise_std, int N) {std::default_random_engine generator;std::normal_distribution<double> noise(0.0, noise_std);xs.resize(N);ys.resize(N);for (int i = 0; i < N; ++i) {xs[i] = i * 0.1;  // 讓x均勻增長ys[i] = true_a * xs[i] + true_b + noise(generator);}
}// MAP線性回歸:最小化 (Ax - y)^2 + lambda * ||x||^2
void map_fit(const std::vector<double>& xs, const std::vector<double>& ys, double lambda, double& est_a, double& est_b) {int N = xs.size();Eigen::MatrixXd A(N, 2);Eigen::VectorXd y(N);for (int i = 0; i < N; ++i) {A(i, 0) = xs[i];A(i, 1) = 1.0;y(i) = ys[i];}// 正規方程帶正則項:(A^T A + lambda * I) x = A^T yEigen::Matrix2d ATA = A.transpose() * A;Eigen::Vector2d ATy = A.transpose() * y;ATA += lambda * Eigen::Matrix2d::Identity(); // 加上正則化Eigen::Vector2d x = ATA.ldlt().solve(ATy);est_a = x(0);est_b = x(1);
}int main() {std::vector<double> xs, ys;double true_a = 2.0, true_b = 1.0;generate_data(xs, ys, true_a, true_b, 0.1, 50);double est_a = 0.0, est_b = 0.0;double lambda = 1.0; // 正則化強度map_fit(xs, ys, lambda, est_a, est_b);std::cout << "真實值: a = " << true_a << ", b = " << true_b << std::endl;std::cout << "MAP估計: a = " << est_a << ", b = " << est_b << std::endl;return 0;
}

7. 總結一下

對象含義
似然擬合觀測數據的準確性
先驗防止參數過大(正則化)
MAP估計似然 × 先驗的最大化
公式最小化誤差項 + 正則項

直觀理解:

  • 你希望擬合數據,同時又不希望參數太大(比如防止過擬合)。
  • 正則化參數 ( λ ) ( \lambda ) (λ) 越大,先驗越強,越傾向于把 ( a , b ) ( a, b ) (a,b) 拉向 0。

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

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

相關文章

16、路由守衛:設置魔法結界——React 19 React Router

一、魔法結界的本質 "路由守衛是霍格沃茨城堡的隱身斗篷&#xff0c;在時空裂隙中精準控制維度躍遷&#xff01;" 魔法部交通司官員揮舞魔杖&#xff0c;React Router 的嵌套路由在空中交織成星軌矩陣。 ——基于《國際魔法聯合會》第7號時空協議&#xff0c;路由守…

從車道檢測項目入門open cv

從車道檢測項目入門open cv 前提聲明&#xff1a;非常感謝b站up主 嘉然今天吃帶變&#xff0c;感謝其視頻的幫助。同時希望各位大佬積積極提出寶貴的意見。&#x1f60a;&#x1f60a;&#x1f60a;(???)(●’?’●)╰(▽)╯ github地址&#xff1a;https://github.com/liz…

【行業特化篇3】制造業簡歷優化指南:技術參數與標準化流程的關鍵詞植入藝術

寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offe…

如何在本地部署小智服務器:從源碼到全模塊運行的詳細步驟

小智聊天機器人本地后臺服務器源碼全模塊部署 作者&#xff1a;林甲酸 -不是小女子也不是女漢子 是大女子 更新日期&#xff1a;2025年4月29日 &#x1f3af; 前言&#xff1a;為什么要寫這篇教程&#xff1f; 上周按照蝦哥小智服務器的教程去部署本地后臺&#xff0c;我用的是…

github開源項目添加開源協議,使用很簡單

直接在 GitHub 網頁上創建 進入你的 GitHub 倉庫 打開你的項目倉庫頁面&#xff08;如 https://github.com/用戶名/倉庫名&#xff09;。 點擊 "Add file" → "Create new file" 在倉庫主頁&#xff0c;點擊右上角的 "Add file" 按鈕&#xff…

8.idea創建maven項目(使用Log4j日志記錄框架+Log4j 介紹)

8.idea創建maven項目(使用Log4j日志記錄框架Log4j 介紹) 在 IntelliJ IDEA 的 Maven 項目中引入了 Log4j&#xff0c;并配置了日志同時輸出到控制臺和文件。 Log4j 提供了靈活的日志配置選項&#xff0c;可以根據項目需求調整日志級別、輸出目標和格式。 1. 創建 Maven 項目 …

【和春筍一起學C++】函數——C++的編程模塊

目錄 1. 原型句法 2. 函數分類 3. 函數參數之按值傳遞 4. 數組作為函數參數 在C中&#xff0c;要使用函數&#xff0c;必須要有這三個方面&#xff1a; 函數原型&#xff0c;函數原型描述了函數到編譯器的接口&#xff0c;函數原型一般放在include文件中。函數原型告訴編譯…

深挖Java基礎之:認識Java(創立空間/先導:Java認識)

今天我要介紹的是在Java中對Java的一些基本語法的認識與他們的運用&#xff0c;以及擬舉例子說明和運用場景&#xff0c;優勢和劣勢&#xff0c; 注&#xff1a;本篇文章是對Java的一些基本的&#xff0c;簡單的代碼塊的一些內容&#xff0c;后續會講解在Java中的變量類型&…

Python+Selenium+Pytest+Allure PO模式UI自動化框架

一、框架結構 allure-report&#xff1a;測試報告base&#xff1a;定位元素封裝data&#xff1a;數據log&#xff1a;日志文件page&#xff1a;頁面封裝文件夾report&#xff1a;緩存報告testcases&#xff1a;測試用例層utils&#xff1a;工具類run.py&#xff1a;執行文件 二…

博物館除濕控濕保衛戰:M-5J1R 電解除濕科技如何重塑文物守護的未來

在盧浮宮幽深的長廊里&#xff0c;達芬奇的《蒙娜麗莎》正經歷著一場看不見的戰爭——不是來自時間的侵蝕&#xff0c;而是空氣中無形的水分子。每一件文物都在與濕度進行著無聲的抗爭&#xff0c;這場抗爭關乎人類文明的延續。濕度&#xff0c;這個看不見的文物殺手&#xff0…

【嘉立創EDA】如何找到曲線和直線的交點,或找到弧線和直線的交點

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.38 本文使用嘉立創EDA,描述如何快速找到曲線和直線交點的方法,這里的曲線包括了弧線等。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題…

大語言模型能否替代心理治療師的深度拓展研究:fou

大語言模型能否替代心理治療師的深度拓展研究 在科技初創企業和研究領域,大型語言模型(LLMs)用于替代心理健康服務提供者的應用備受關注。但研究人員通過對主要醫療機構治療指南的梳理回顧,并對當前 LLMs(如 gpt-4o)進行實驗評估后發現,LLMs 存在對心理疾病患者表達污名…

【linux】Chrony服務器

簡介 1.1 時間的重要性 由于 IT 系統中&#xff0c;準確的計時非常重要&#xff0c;有很多種原因需要準確計時&#xff1a; 在網絡傳輸中&#xff0c;數據包括和日志需要準確的時間戳 各種應用程序中&#xff0c;如訂單信息&#xff0c;交易信息等 都需要準確的時間戳 1.2 時區…

mysql查看哪些表的自增id已超過某個值

場景 想看哪些表數據比較大&#xff0c;如果用count 比較慢&#xff0c;同時表設計如果是自增&#xff0c;有沒有辦法一次查出自增id已超過某值的所有表呢。 方法 SELECT AUTO_INCREMENT,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 庫名 AND AUTO_INCRE…

SiamMask原理詳解:從SiamFC到SiamRPN++,再到多任務分支設計

SiamMask原理詳解&#xff1a;從SiamFC到SiamRPN&#xff0c;再到多任務分支設計 一、引言二、SiamFC&#xff1a;目標跟蹤的奠基者1. SiamFC的結構2. SiamFC的局限性 三、SiamRPN&#xff1a;引入Anchor機制的改進1. SiamRPN的創新2. SiamRPN的進一步優化 四、SiamMask&#x…

SpringBoot終極形態:AI生成帶OAuth2鑒權的微服務模塊(節省20人日)

在數字化轉型的浪潮中,開發效率和質量是企業競爭力的關鍵要素。飛算 JavaAI 作為一款創新的 AI 工具,能在 Spring Boot 開發中,自動生成完整微服務模塊,極大提升開發效率。下面,我們就詳細介紹如何借助飛算 JavaAI,實現 Spring Boot 微服務模塊的自動化生成。 飛算 JavaAI 簡介…

Spring緩存注解深度實戰:3大核心注解解鎖高并發系統性能優化?

引言&#xff1a;緩存——高并發系統的“性能加速器”? 在互聯網應用中&#xff0c;數據庫查詢往往是性能瓶頸的核心。當每秒數千次的請求直接沖擊數據庫時&#xff0c;系統響應速度會急劇下降&#xff0c;甚至引發宕機風險。?緩存技術?應運而生&#xff0c;成為解決這一痛…

CSS元素動畫篇:基于當前位置的變換動畫(二)

基于當前位置的變換動畫&#xff08;二&#xff09; 前言旋轉效果類元素動畫搖擺動畫效果效果預覽代碼實現 搖晃動畫效果效果預覽代碼實現 螺旋旋轉效果預覽代碼實現 結語 前言 CSS元素動畫一般分為兩種&#xff1a;一種是元素基于當前位置的變換動畫&#xff0c;通過不明顯的…

Qt/C++開發監控GB28181系統/設備注冊/設備注銷/密碼認證/心跳保活/校時

一、前言 根據gb28181協議文檔&#xff0c;第一步就是需要實現設備的注冊&#xff0c;和onvif不同&#xff0c;gb是反過來的&#xff0c;設備端主動連接服務端&#xff0c;而onvif是服務端主動發出搜索&#xff0c;設備被動應答&#xff0c;包括后續的交互幾乎都是被動應答&am…

MATLAB 中的圖形繪制

一、線圖 plot 函數用來創建x和y值的簡單線圖。 x 0 : 0.05 : 30; %從0到30&#xff0c;每隔0.05取一次值 y sin(x); plot(x,y,LineWidth,2) %若&#xff08;x&#xff0c;y&#xff0c;LineWidth&#xff0c;2&#xff09;可變粗 xlabel("橫軸標題") ylab…