基于MATLAB的马尔科夫链蒙特卡洛(MCMC)模拟实现方法

一、MCMC核心算法实现

1. Metropolis-Hastings算法

MATLAB代码示例(目标分布为双峰混合高斯分布):

matlab 复制代码
% 参数设置
N = 1e5;          % 迭代次数
x = zeros(N,1);   % 初始化链
x(1) = 0;         % 初始值
mu1 = 1; sigma1 = 1;  % 第一个高斯分布参数
mu2 = 5; sigma2 = 1;  % 第二个高斯分布参数

% 目标分布定义
target = @(x) 0.3*normpdf(x,mu1,sigma1) + 0.7*normpdf(x,mu2,sigma2);

% 提议分布(高斯随机游走)
step = 1;  % 步长

% MCMC迭代
for i = 2:N
    x_star = x(i-1) + step*randn;  % 生成候选点
    % 计算接受概率
    alpha = min(1, target(x_star)/target(x(i-1)));
    if rand < alpha
        x(i) = x_star;
    else
        x(i) = x(i-1);
    end
end

% 可视化结果
figure;
histogram(x,50,'Normalization','pdf');
hold on;
x_plot = linspace(-2,8,1000);
plot(x_plot,target(x_plot),'r','LineWidth',2);
title('MCMC采样结果与目标分布对比');
xlabel('x'); ylabel('密度');
2. 吉布斯采样(Gibbs Sampling)

应用场景:多元高斯分布参数估计

matlab 复制代码
% 生成模拟数据
mu_true = [2; -1]; Sigma = [1 0.8; 0.8 1];
data = mvnrnd(mu_true,Sigma,1000);

% 初始化参数
mu = [0; 0]; sigma = 1;

% 吉布斯采样
N = 5000; burn_in = 1000;
for i = 1:N
    % 更新mu | sigma
    mu = mvnrnd(mu, inv(sigma)*data'/(inv(sigma)*data'*inv(sigma)+eye(2)/10));
    
    % 更新sigma | mu
    sigma = wishrnd(inv(data'*data/10 + eye(2)), 3);
end

% 去除燃烧期
mu = mu(burn_in:end,:);

二、收敛性诊断方法

1. 图形化诊断工具
matlab 复制代码
% 绘制轨迹图
figure;
plot(x(1:1000:end)); 
title('马尔可夫链轨迹图');

% 自相关分析
lags = 1:50;
ac = autocorr(x,lags);
figure;
stem(lags,ac,'filled');
title('自相关函数');
2. 统计检验指标
matlab 复制代码
% Geweke诊断
[ge,gep](@ref)= geweke(x);
disp(['Geweke检验p值: ', num2str(gep)]);

% 有效样本量计算
ess = effective_sample_size(x);
disp(['有效样本量: ', num2str(ess)]);

三、优化

1. 自适应步长调整
matlab 复制代码
% 根据接受率动态调整步长
if acceptance_rate > 0.4
    step = step * 1.1;
elseif acceptance_rate < 0.2
    step = step * 0.9;
end
2. 并行计算加速
matlab 复制代码
% 使用parfor实现并行采样
parfor i = 1:num_chains
    chain(:,:,i) = run_chain(theta_init);
end
3. Hamiltonian Monte Carlo
matlab 复制代码
% 引入动量变量
p = randn(size(theta));
for i = 1:N
    [p, theta](@ref)= leapfrog(p, theta, epsilon, L);
    if rand < exp(-H(p,theta))
        accept(i) = 1;
    end
end

四、完整代码模板

matlab 复制代码
function mcmc_demo()
    % 参数初始化
    theta_init = [0; 0];
    num_iter = 1e5;
    burn_in = 1e4;
    
    % 构建目标分布
    target = @(x) log_target(x);
    
    % 运行MCMC
    [theta_chain, logp](@ref)= run_mcmc(target, theta_init, num_iter);
    
    % 后处理
    theta_samples = theta_chain(burn_in:end,:);
    plot_results(theta_samples);
end

function [chain, logp](@ref)= run_mcmc(target, theta0, num_iter)
    % 初始化
    d = length(theta0);
    chain = zeros(d,num_iter);
    chain(:,1) = theta0;
    logp = zeros(num_iter,1);
    
    % 初始对数概率
    logp(1) = target(theta0);
    
    % 迭代采样
    for i = 2:num_iter
        % 生成候选点
        theta_star = propose_step(chain(:,i-1));
        
        % 计算对数概率差
        logp_star = target(theta_star);
        log_alpha = logp_star - logp(i-1);
        
        % 接受/拒绝
        if log(rand) < log_alpha
            chain(:,i) = theta_star;
            logp(i) = logp_star;
        else
            chain(:,i) = chain(:,i-1);
            logp(i) = logp(i-1);
        end
    end
end

五、性能优化

  1. 预处理数据:对高维数据进行降维处理(PCA/T-SNE)
  2. 稀疏化采样:在低概率区域减少采样密度
  3. GPU加速 :使用gpuArray加速矩阵运算
  4. 诊断监控:实时绘制接受率与能量曲线

六、资源推荐

  1. 经典文献: Geman S., Geman D. (1984) 《Stochastic Relaxation》 Neal R. M. (2011) 《Handbook of Markov Chain Monte Carlo》
  2. 代码 :多能源系统优化包含粒子群SVM等优化算法 www.youwenfan.com/contentcsl/80721.html
  3. MATLAB工具箱: Statistics and Machine Learning Toolbox Global Optimization Toolbox
相关推荐
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab7 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab7 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP11 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年11 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼11 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS11 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区12 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈12 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang13 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx