MCMC:Gibbs 采样(matlab 实现)

MCMC: The Gibbs Sampler
多元高斯分布的边缘概率和条件概率
Marginal and conditional distributions of multivariate normal distribution

clear, clc
rng('default')

num_samples = 5000;
num_dims = 2;

mu = [0, 0];
rho(1) = .8; rho(2) = .8;

prop_sigma = 1;
minn = [-3, -3]; maxx = [3, 3];
x = zeros(num_samples, num_dims);

x(1, 1) = unifrnd(minn(1), maxx(1));
x(1, 2) = unifrnd(minn(2), maxx(2));

t = 1;
dims = 1:num_dims;
while t < num_samples
    t = t + 1;
    T = [t-1, t];           % 时刻信息的维护,T(1):上一时刻,T(2):下一时刻
    for iD = 1:num_dims
        not_idx = (dims ~= iD);
        mu_cond = mu(iD) + rho(iD)*(x(T(iD), not_idx) - mu(not_idx));
        sigma_cond = sqrt(1-rho(iD)^2);
        x(t, iD) = normrnd(mu_cond, sigma_cond);
    end
end

figure;
h1 = scatter(x(:, 1), x(:, 2), 'r.');
hold on

for t=1:50
    plot([x(t, 1), x(t+1, 1)], [x(t, 2), x(t, 2)], 'k-');           % x 轴方向移动,
    plot([x(t+1, 1), x(t+1, 1)], [x(t, 2), x(t+1, 2)], 'k-');       % y 轴方向移动;
    h2 = plot(x(t+1, 1), x(t+1, 2), 'ko');
end

h3 = scatter(x(1, 1), x(1, 2), 'go', 'linewidth', 3);
legend([h1, h2, h3], {'Samples', '1st 50 samples', 'x(t=0)'}, 'location', 'northwest');
hold off;
xlabel('x_1'); ylabel('x_2')
axis square
  • 3
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MCMC(Markov Chain Monte Carlo)是一种常用的随机抽样方法,用于估计高维概率分布中的参数。在MATLAB中,有许多库和工具箱支持MCMC算法,如`Statistics and Machine Learning Toolbox`。以下是一个简单的Metropolis-Hastings算法的示例代码,这是MCMC中最基础的方法之一: ```matlab % 导入所需的库 if ~isToolboxAvailable('Statistics') error('Please install Statistics and Machine Learning Toolbox for MCMC examples.'); end % 定义目标密度函数 (假设我们有一个正态分布) function pdf = targetDensity(x, mu, sigma) pdf = 1 / (sigma * sqrt(2 * pi)) * exp(- mu)^2) / (2 * sigma^2)); end % 初始化参数 mu_init = 0; % 假设正态分布的均值 sigma_init = 1; % 假设标准差 numSamples = 10000; % 想要采样的样本数量 burnInPeriod = floor(numSamples * 0.1); % 燃烧期丢弃 % 初始化链 chain = zeros(burnInPeriod + numSamples, 2); x_current = mu_init; chain(1, :) = [x_current; 0]; % 第一个点初始化为0 % MCMC循环 for i = 2:burnInPeriod + numSamples % 提取当前样本 x_current = chain(i - 1, 1); % 生成提案 proposal_mu = x_current + randn() * 0.5; % 均值附近随机移动 proposal_sigma = sigma_init + randn() * 0.1; % 标准差随机变化 % 计算目标密度和提案密度 pdf_current = targetDensity(x_current, mu_init, sigma_init); pdf_proposal = targetDensity(proposal_mu, mu_init, proposal_sigma); % Metropolis-Hastings接受概率 acceptance_ratio = min(1, pdf_proposal / pdf_current); % 随机决定是否接受提案 if rand < acceptance_ratio chain(i, :) = [proposal_mu; proposal_sigma]; else chain(i, :) = [x_current; proposal_sigma]; % 如果拒绝,保持原状态 end end % 删除燃烧期并计算均值和标准差 posterior_samples = chain(burnInPeriod + 1:end, :); [mean_post, std_post] = meanstd(posterior_samples(:, 1), 'omitnan'); % 打印结果 disp(['Mean: ', num2str(mean_post)]) disp(['Standard Deviation: ', num2str(std_post)]) % 相关问题-- 1. MCMC在什么情况下最适合使用? 2. 如何调整Metropolis-Hastings算法的参数来优化采样效率? 3. 在实际应用中,如何确定MCMC的停止条件? ``` 请注意,这只是一个基础示例,实际应用可能需要更复杂的适应性步骤、自适应尺度参数或其他改进方法。如果你有特定的概率分布或问题想要模拟,代码将有所不同。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值