MCMC采样,用MMH算法的MATLAB代码
时间: 2023-12-22 21:02:23 浏览: 98
下面是一个基于Matlab的MCMC采样,使用了MMH算法的示例代码。以高斯分布为例:
```matlab
% 目标分布函数
target_pdf = @(x) exp(-x.^2/2)/sqrt(2*pi);
% MCMC算法参数
n_samples = 1e5; % 采样数量
n_burnin = 1e4; % 燃烧期数量
thin_step = 5; % 间隔抽样步长
% 初始状态
x0 = 0;
% MCMC算法参数初始化
x = x0;
samples = zeros(n_samples, 1);
accept_count = 0;
% 进行MCMC采样
for i = 1:(n_samples + n_burnin)
% 随机游走
x_proposed = normrnd(x, 1);
% 计算接受率
alpha = min(1, target_pdf(x_proposed)/target_pdf(x));
% 计算比例项
t_proposed = normpdf(x, x_proposed, 1);
t = normpdf(x_proposed, x, 1);
beta = t_proposed/t;
% 计算总接受率
alpha = alpha * beta;
% 判断是否接受
if rand < alpha
x = x_proposed;
accept_count = accept_count + 1;
end
% 记录样本
if i > n_burnin && mod(i-n_burnin-1, thin_step) == 0
samples((i-n_burnin-1)/thin_step+1) = x;
end
end
% 计算接受率
accept_rate = accept_count / (n_samples + n_burnin);
% 绘制样本分布
figure;
histogram(samples, 'Normalization', 'pdf');
hold on;
x = linspace(-5, 5, 1000);
y = target_pdf(x);
plot(x, y, 'r-', 'LineWidth', 2);
xlabel('x');
ylabel('p(x)');
title(sprintf('Accept rate: %.2f%%', accept_rate*100));
```
在这个示例中,我们使用了高斯分布作为目标分布函数。根据MMH算法,我们需要计算接受率和比例项。在代码中,我们使用了normrnd和normpdf函数来进行随机游走和概率密度计算。需要注意的是,在实际应用中,需要根据采样的目标分布函数进行相应的参数设置和计算。
阅读全文