matlab中的大都会黑斯廷斯

matlab中的大都会黑斯廷斯,matlab,random,mcmc,random-walk,Matlab,Random,Mcmc,Random Walk,我试图使用Metropolis Hastings算法和随机行走采样器来模拟matlab中函数$$的样本,但我的代码有问题。建议密度为椭圆2s^2+3t^2上的统一PDF≤ 1/4. 我可以使用接受-拒绝方法从提案密度中取样吗 N=5000; alpha = @(x1,x2,y1,y2) (min(1,f(y1,y2)/f(x1,x2))); X = zeros(2,N); accept = false; n = 0; while n < 5000 accept = false;

我试图使用Metropolis Hastings算法和随机行走采样器来模拟matlab中函数$$的样本,但我的代码有问题。建议密度为椭圆2s^2+3t^2上的统一PDF≤ 1/4. 我可以使用接受-拒绝方法从提案密度中取样吗

N=5000;
alpha = @(x1,x2,y1,y2) (min(1,f(y1,y2)/f(x1,x2)));
X = zeros(2,N);
accept = false;
n = 0;
while n < 5000
    accept = false;
    while ~accept
        s = 1-rand*(2);
        t = 1-rand*(2);
        val = 2*s^2 + 3*t^2;
        % check acceptance
        accept = val <= 1/4;
    end
    % and then draw uniformly distributed points checking that u< alpha?
    u = rand();
    c = u < alpha(X(1,i-1),X(2,i-1),X(1,i-1)+s,X(2,i-1)+t);
    X(1,i) = c*s + X(1,i-1);
    X(2,i) = c*t + X(2,i-1);
    n = n+1;
end
figure;
plot(X(1,:), X(2,:), 'r+');
N=5000;
α=@(x1,x2,y1,y2)(最小值(1,f(y1,y2)/f(x1,x2));
X=零(2,N);
接受=错误;
n=0;
而n<5000
接受=错误;
当~接受
s=1兰特*(2);
t=1-rand*(2);
val=2*s^2+3*t^2;
%承兑汇票

accept=val您可能只想使用matlab的本机实现

关于您的代码,缺少一些东西: -函数
alpha
, -循环变量
i
(它可能只是
n
,但不适合索引,因为它从零开始)。
如果您想动态填充matlab中的内存,也就是说,您应该始终在matlab中分配内存。

要扩展@max的建议,如果您将
i
索引更改为
n
并替换

n=0

n=2;
X(:,1)=[1,1]

最好将
X(:,1)
分配给接受区域内的随机值(使用稍后使用的相同代码),和/或包括一个磨合期


取决于您将如何处理它,在
f
函数中对
sin
的参数求值,使其保持在0到2π的范围内(如果超过这些界限,可能会将值移动2π)

我更新了代码,但现在看不出有什么问题。我需要一个for循环吗?