高斯的matlab编程差异
A matlab programming difference for Gaussian
在我的作业中,我被要求描述一个方法可以产生一个高斯分布。 matlab程序如下:
n=100;
b=25;
len=200000;
X=rand(n,len);
x=sum(X-0.5)*b/n;
[ps2,t2]=hist(x,50);
ps2=ps2/len;
bar(t2,ps2,'y');
hold on;
sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);
[ps2,t2]=hist(R,50);
ps2=ps2/len;
plot(t2,ps2,'bo-','linewidth',1.5);
x 是 n 个均匀分布的变量乘以 b/n 的总和。 x 是零均值且 sigma^2=b^2/12n 的高斯分布。
然后我得到了两个分布匹配的图像。
但是,当我将 t2 代入正态分布密度函数 f(x)=exp(-x.^2/(2*sigma_2))/sqrt(2*pi*sigma_2)
时,输出比第一个大很多,尽管形状相似。
我想知道为什么会这样?
这是因为你没有规范化离散直方图。我们知道在连续分布中,概率函数的积分是一。为了解决这个问题,您应该将直方图划分为其积分。离散函数的近似积分是矩形积分:
integral (f) = sum(f)* LengthStep
所以你应该这样修改你的代码:
n=100;
b=25;
len=200000;
X=rand(n,len);
x=sum(X-0.5)*b/n;
[ps2,t2]=hist(x,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1))); % normalize discrete distribution
bar(t2,ps2,'y');
hold on;
sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);
[ps2,t2]=hist(R,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1))); % normalize discrete distribution
plot(t2,ps2,'bo-','linewidth',1.5);
hold on
plot(t2,exp(-t2.^2/(2*sigma_2))/sqrt(2*pi*sigma_2),'r'); %plot continuous distribution
这是结果:
在我的作业中,我被要求描述一个方法可以产生一个高斯分布。 matlab程序如下:
n=100;
b=25;
len=200000;
X=rand(n,len);
x=sum(X-0.5)*b/n;
[ps2,t2]=hist(x,50);
ps2=ps2/len;
bar(t2,ps2,'y');
hold on;
sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);
[ps2,t2]=hist(R,50);
ps2=ps2/len;
plot(t2,ps2,'bo-','linewidth',1.5);
x 是 n 个均匀分布的变量乘以 b/n 的总和。 x 是零均值且 sigma^2=b^2/12n 的高斯分布。
然后我得到了两个分布匹配的图像。
但是,当我将 t2 代入正态分布密度函数 f(x)=exp(-x.^2/(2*sigma_2))/sqrt(2*pi*sigma_2)
时,输出比第一个大很多,尽管形状相似。
我想知道为什么会这样?
这是因为你没有规范化离散直方图。我们知道在连续分布中,概率函数的积分是一。为了解决这个问题,您应该将直方图划分为其积分。离散函数的近似积分是矩形积分:
integral (f) = sum(f)* LengthStep
所以你应该这样修改你的代码:
n=100;
b=25;
len=200000;
X=rand(n,len);
x=sum(X-0.5)*b/n;
[ps2,t2]=hist(x,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1))); % normalize discrete distribution
bar(t2,ps2,'y');
hold on;
sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);
[ps2,t2]=hist(R,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1))); % normalize discrete distribution
plot(t2,ps2,'bo-','linewidth',1.5);
hold on
plot(t2,exp(-t2.^2/(2*sigma_2))/sqrt(2*pi*sigma_2),'r'); %plot continuous distribution
这是结果: