基于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
相关推荐
跨境卫士-小汪1 小时前
TikTokShop欧洲商品接口架构调整跨境技术团队需要做好哪些准备
大数据·人工智能·新媒体运营·跨境电商·跨境·营销策略
飞Link1 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
康小汪2 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
收放扳机2 小时前
多机连线(In-Line)场景下,收放板机“缓存工位”的容量与架构选型参考
人工智能·科技·自动化·制造·pcb工艺
武天旭2 小时前
AI安全--AI大模型的后门攻击检测与防御
人工智能·深度学习·安全·机器学习
智能运维指南2 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
人工智能AI技术2 小时前
DeepInfer开源炸场!别再妄想个人电脑跑满血DeepSeek
人工智能
深蓝电商API2 小时前
用AI生成拟人行为:让鼠标轨迹更“有人味”
人工智能·爬虫
znnnk2 小时前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle
深蓝AI3 小时前
网站正在对 AI Agent 集体关门:亚马逊封锁 Muse、银行拒绝登录,开发者怎么活下去
人工智能