我的任务是比较模拟正态分布的不同方法。例如,我使用以下代码生成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');
然而,它看起来很丑陋 - 我不能val1
与val2
区别开来,而且我的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方法或其他方法,只是不那么复杂)?
答案 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)