Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Metropolis Hastings算法,在Matlab中使用非高斯分布的建议分布_Matlab_Math_Gaussian_Mcmc - Fatal编程技术网

Metropolis Hastings算法,在Matlab中使用非高斯分布的建议分布

Metropolis Hastings算法,在Matlab中使用非高斯分布的建议分布,matlab,math,gaussian,mcmc,Matlab,Math,Gaussian,Mcmc,我目前正在攻读数学学位的最后一年项目,该项目基于对Metropolis Hastings算法和一些数值示例的概述。 到目前为止,我已经通过将我的建议分布用作高斯分布,并从其他几个分布中进行采样,获得了一些很好的结果,但是我正试图通过使用不同的建议分布来更进一步 到目前为止,我已经得到了这段代码(我使用的是Matlab),但是由于使用不同方案的在线资源有限,很难判断我是否接近,因为在现实中,我不太确定如何尝试这一点(特别是因为到目前为止,这没有提供有用的数据输出) 如果有人能帮我一把,如果他们知道

我目前正在攻读数学学位的最后一年项目,该项目基于对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
n=1000;%%迭代次数
x(1)=-3;%%生成起点
%%%%目标分布:高斯分布:
strg='1/(平方英尺(2*pi*(sig)))*exp(-0.5*((x-mu)/平方英尺(sig))。^2';
tnorm=inline(strg,'x','mu','sig');
mu=1;%%高斯参数(我将根据我的马尔可夫链x估计这些参数)
sig=3;
%%%%提案分配:拉普拉斯:
strg='(1/(2*b))*exp(-1)*abs(x-mu)/b';
拉普拉斯=内联(strg,'x','b','mu');
b=2;%%拉普拉斯参数,我将使用y和x(I-1)的值表示mu
%%%%接受-拒绝生成马尔可夫链
对于i=2:n
%%%%从提案分发中生成候选人
y=拉普拉斯(randn(1),b,x(i-1));
%%%%生成一个用于比较的统一标准
u=兰特(1);
α=最小值([1,(t形式(y,μ,sig)*拉普拉斯(x(i-1),b,y))/(t形式(x(i-1),μ,sig)*拉普拉斯(y,b,x(i-1)));

如果u作为参考,这已经在另一个站点上通过@ripegraph解决了,我从拉普拉斯分布生成随机数的方法是不正确的,实际上应该使用:

他还指出,拉普拉斯分布是对称的,因此根本不需要包含在代码中

在做了更多的研究之后,我发现如果你有X~Gamma(v/2,2),它就会变成X~ChiSquare(v),这是使用非高斯方案的一个更好的例子。然而,要使用此示例,您需要使用独立采样器(幻灯片89)

希望这对某人有用