模拟并呈现正态分布

时间:2014-12-09 20:37:34

标签: normal-distribution matlab simulation

我的任务是比较模拟正态分布的不同方法。例如,我使用以下代码生成2个向量,每个1000个值(Box-Muller方法):

    k=1;
    mu=0;
    N = 1000;
    alpha = rand(1, N);
    beta = rand(1, N);
    val1 = sqrt(-2 * log(alpha)) .* sin(2 * pi * beta);
    val2 = sqrt(-2 * log(alpha)) .* cos(2 * pi * beta);


    hist([val1,val2]);
    hold on;
    %Now I want to make normal distr pdf over hist to see difference
    [f,x] = ecdf(mu+sigma*[val1,val2]);
    p = normpdf(x,mu, sigma);
    plot(x,p*N,'r');

然而,它看起来很丑陋 - 我不能val1val2区别开来,而且我的pdf也不能很好地拟合直方图。我觉得我对这个pdf做错了什么,但我不知道是什么。我在互联网上找到了不同的代码:

r = rand(1000,2); % 2 cols of uniform rand
%Box-Muller
%n = sqrt(-2*log(r(:,1)))*[1,1].*[cos(2*pi*r(:,2)), sin(2*pi*r(:,2))];
hist(n) % plot two histograms

它看起来更好,但我不知道如何在其上绘制正态分布pdf - 使用ecdf导致错误的方法。
我在Matlab中比较新,有时我犯了简单的错误(比如矢量尺寸)但是现在我几乎看不到它们。
有人可以帮助我上面或提出另一种模拟正常随机变量和比较的方法(使用B-M方法或其他方法,只是不那么复杂)?

1 个答案:

答案 0 :(得分:0)

我认为您的图表有不同的比例,更正的代码看起来像这样:

clear all;
sigma=1; mu=0; N = 1000;
alpha = rand(1, N); beta = rand(1, N);
val1 = sqrt(-2 * log(alpha)) .* sin(2 * pi * beta);
val2 = sqrt(-2 * log(alpha)) .* cos(2 * pi * beta);
vals = [val1,val2];

Nbins = 50; [h,hx] = hist(vals,Nbins);
bar(hx,h*0.5/(hx(2)-hx(1)))
hold on;

%Now I want to make normal distr pdf over hist to see difference
[f,x] = ecdf(mu+sigma*vals);
p = normpdf(x,mu, sigma);
plot(x,p*N,'r');

如评论中所述,分布的定量比较需要进行统计检验(例如,拟合度http://en.wikipedia.org/wiki/Goodness_of_fit