【发布时间】:2013-03-28 18:30:16
【问题描述】:
我目前正在完成我的数学学位的最后一年项目,该项目基于对 Metropolis-Hastings 算法的概述和一些数值示例。 到目前为止,通过将我的建议分布用作高斯分布并从其他几个分布中采样,我已经获得了一些很好的结果,但是我正试图通过使用不同的建议分布更进一步。
到目前为止,我已经得到了这段代码(我正在使用 Matlab),但是由于在线资源有限,关于使用不同的建议很难判断我是否接近,因为实际上我不太确定如何尝试这个, (特别是因为到目前为止这没有提供有用的数据输出)。
如果有人知道或转发给我一些易于访问的信息,如果有人能伸出援手,那就太好了(我知道我不仅在询问编码建议,还询问数学)。
所以,我想使用拉普拉斯的提议分布从高斯样本中采样,这是我目前的代码:
n = 1000; %%%%number of iterations
x(1) = -3; %%%%Generate a starting point
%%%%Target distribution: Gaussian:
strg = '1/(sqrt(2*pi*(sig)))*exp(-0.5*((x - mu)/sqrt(sig)).^2)';
tnorm = inline(strg, 'x', 'mu', 'sig');
mu = 1; %%%%Gaussian Parameters (I will be estimating these from my markov chain x)
sig = 3;
%%%%Proposal distribution: Laplace:
strg = '(1/(2*b))*exp((-1)*abs(x - mu)/b)';
laplace = inline(strg, 'x', 'b', 'mu');
b = 2; %%%%Laplace parameter, I will be using my values for y and x(i-1) for mu
%%%%Generate markov chain by acceptance-rejection
for i = 2:n
%%%%Generate a candidate from the proposal distribution
y = laplace(randn(1), b, x(i-1));
%%%%Generate a uniform for comparison
u = rand(1);
alpha = min([1, (tnorm(y, mu, sig)*laplace(x(i-1), b, y))/(tnorm(x(i-1), mu, sig)*laplace(y, b, x(i-1)))]);
if u <= alpha
x(i) = y;
else
x(i) = x(i-1);
end
end
如果有人能告诉我上述是否完全错误/以错误的方式进行,或者只是有一些错误(我非常警惕我在 for 循环中生成的“y”是完全错误的) 那太棒了。
谢谢,汤姆
【问题讨论】: