MCMC(random walk) Matlab代码

f ( x ) = 0.3 N ( 1 , 1 ) + 0.7 N ( 5 , 1 ) f(x)=0.3N(1,1)+0.7N(5,1) f(x)=0.3N(1,1)+0.7N(5,1)中采样

%MH-MCMC
N=10000;
x=zeros(N,1);%初始点
p=@(x) 0.3*normpdf(x,1)+0.7*normpdf(x,5);%目标函数
q=@(x,mu) normpdf(x,mu,1);%转移核

for ii=2:N
    xtemp=x(ii-1)+normrnd(0,1);%random walk生成候选点
    pxs=p(xtemp);
    px=p(x(ii-1));
    qxs=q(xtemp,x(ii-1));%也可以取1
    qx=q(x(ii-1),xtemp);%也可以取1
    acc=pxs*qx/(px*qxs);
    if acc>rand
        x(ii)=xtemp;
    else
        x(ii)=x(ii-1);
    end
end

mesh=linspace(-2,8,10000);
plot(mesh,p(mesh));
hold on
histogram(x,64,'Normalization','pdf')
hold off
MCMC(马尔可夫链蒙特卡洛)是一种在统计学中广泛使用的参数估计方法,用于在高维空间中采样分布并估计未知参数。MATLAB提供了许多函数来实现MCMC参数估计,包括MCMC、Metropolis-Hastings(MH算法等。 使用MCMC进行参数估计的一般步骤: 1.选择适当的概率分布函数作为先验分布,确定参数的初始值。 2.设置一个接受准则(接受率)来控制抽样过程中的新样本是否被接受。 3.运行MCMC程序,生成大量样本数据,并计算参数的估计值。 下面是一个简单的MATLAB代码示例,以估计正态分布的均值为例: %% 生成随机数据 mu_true = 5; sigma_true = 2; data = normrnd(mu_true,sigma_true,100,1); %% MCMC参数估计 %先验分布:均值为3、标准差为1的正态分布 mu_prior = 3; sigma_prior = 1; prior_pdf = @(mu) normpdf(mu,mu_prior,sigma_prior); % 定义接受准则 acceptance_ratio = 0.5; %初始值 mu0 = 0; sigma0 = 1; %设置迭代次数 num_iterations = 10000; %运行MCMC程序 mu = mu0; sigma = sigma0; mu_list = zeros(num_iterations,1); %存储每次抽样的mu值 num_accepted = 0; %记录接受样本的数量 for i=1:num_iterations % 生成新样本 mu_new = normrnd(mu,sigma); % 计算接受概率 likelihood_new = sum(log(normpdf(data,mu_new,sigma_true))); %似然函数 likelihood_old = sum(log(normpdf(data,mu,sigma_true))); prior_new = log(prior_pdf(mu_new)); prior_old = log(prior_pdf(mu)); acceptance_prob = exp(likelihood_new + prior_new - likelihood_old - prior_old); % 检查样本是否被接受 if rand < min(1,acceptance_prob)*acceptance_ratio mu = mu_new; num_accepted = num_accepted + 1; end %将mu加入样本集 mu_list(i) = mu; end % 绘制结果 histogram(mu_list) title(['MCMC估计的均值:',num2str(mean(mu_list)),',实际均值:',num2str(mu_true)]) xlabel('mu') ylabel('频率') 通过这个简单的例子,我们可以看到MCMC参数估计对于高维空间中的复杂问题非常有用。在实际应用中,我们需要根据具体问题选择适当的先验分布和接受准则,并进行充分的迭代,以获得更加准确的估计结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值