【问题标题】:Central Limit Theorem in matlabmatlab中的中心极限定理
【发布时间】:2014-02-15 00:30:44
【问题描述】:

我试图通过比较三个 RV 和正态分布的直方图来证明 matlab 中的 CLT。

这是我的代码:

clc;clear;
len = 50000;

%y0 : Exponential Distribution
lambda = 3;
y0=-log(rand(1,len))./lambda;


%y1 :  Rayleigh Distribution
mu = 0;
sig = 2;
var1 = mu + sig*randn(1,len);
var2 = mu + sig*randn(1,len);
t1 = var1 .^ 2;
t2 = var2 .^ 2;
y1 = sqrt(t1+t2);


% %y2: Normal Distribution
y2 =  randn(1,len);


%y3 : What result excpected to be:
mean0 = (sum(y0)+ sum(y1)+ sum(y2)) / (len * 3);%how do I calculate this?
var0 =  1;%how do I calculate this?
y3 = mean0 + var0*randn(1,len);
delta = 0.1;
x3 = min(y3):delta:max(y3);
figure('Name','Normal Distribution');
hist(y3,x3);


%Central Limit Theorem:
%what result is:
res = y0+y1+y2;
xn = min(res):delta:max(res);
figure('Name','Final Result');
hist(res,xn);

我有两个主要问题。

  1. 如何计算 y3 的均值和方差(应该是什么结果)

  2. 我的代码正确吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    由于y0y1y2 是行向量,你必须这样做:

    mean0 = mean([y0 y1 y2]);
    variance0 = var([y0 y1 y2]);
    

    当您创建 [y0 y1 y2] 时,您正在创建一个大向量,其中所有之前的样本都在一个向量中(就好像它们是来自一个单一分布的样本一样)。

    现在只需将其插入您想要的函数(均值和方差),如上所示。


    关于统计部分:我认为你搞错了一些事情。 中心极限定理适用于按相同分布分布的变量之和。它确实可以是任何分布 D,但所有变量必须具有相同的分布 D。您正在尝试对不同的分布求和。

    定理说:

    我为根据指数分布分布的变量编写了一个示例。 运行它,你观察到当你增加 N 时,得到的分布趋向于预期的正态分布。对于 N=1,您有指数分布(与正态分布非常不同),但对于 N=100,您已经有一个非常接近预期正态分布的分布(您可以看到均值和方差基本相同)现在)。

    用于 N=1 的指数的 CLT

    用于 N=3 的指数的 CLT

    用于 N=10 的指数的 CLT

    用于 N=100 的指数的 CLT

    预期正态分布(CLT的收敛分布)

    clc;clear;
    len = 50000;
    lambda = 3;
    
    %yA : Exponential Distribution A
    yA=-log(rand(1,len))./lambda;
    
    %yB : Exponential Distribution B
    yB=-log(rand(1,len))./lambda;
    
    %yC : Exponential Distribution C
    yC=-log(rand(1,len))./lambda;
    
    %yD : Exponential Distribution D
    yD=-log(rand(1,len))./lambda;
    
    %yE : Exponential Distribution E
    yE=-log(rand(1,len))./lambda;
    
    %yF : Exponential Distribution F
    yF=-log(rand(1,len))./lambda;
    
    %yG : Exponential Distribution G
    yG=-log(rand(1,len))./lambda;
    
    %yH : Exponential Distribution H
    yH=-log(rand(1,len))./lambda;
    
    %yI : Exponential Distribution I
    yI=-log(rand(1,len))./lambda;
    
    %yJ : Exponential Distribution J
    yJ=-log(rand(1,len))./lambda;
    
    
    %y1 : What result you expect it to be (centred Gaussian with same variation as exponential):
    mean0 = 0;
    var0 =  var(yA);
    y1 = mean0 + sqrt(var0)*randn(1,len);
    delta = 0.01;
    x1 = min(y1):delta:max(y1);
    figure('Name','Normal Distribution (Expected)');
    hist(y1,x1);
    
    
    %Central Limit Theorem:
    %what result is:
    res1 = (((yA)/1) - mean(yA))*sqrt(1);
    res2 = (((yA+yB)/2) - mean(yA))*sqrt(2);
    res3 = (((yA+yB+yC)/3) - mean(yA))*sqrt(3);
    res4 = (((yA+yB+yC+yD)/4) - mean(yA))*sqrt(4);
    res5 = (((yA+yB+yC+yD+yE)/5) - mean(yA))*sqrt(5);
    res10 = (((yA+yB+yC+yD+yE+yF+yG+yH+yI+yJ)/10) - mean(yA))*sqrt(10);
    delta = 0.01;
    xn = min(res1):delta:max(res1);
    figure('Name','Final Result for N=1');
    hi  st(res1,xn);
    xn = min(res2):delta:max(res2);
    figure('Name','Final Result for N=2');
    hist(res2,xn);
    xn = min(res3):delta:max(res3);
    figure('Name','Final Result for N=3');
    hist(res3,xn);
    xn = min(res4):delta:max(res4);
    figure('Name','Final Result for N=4');
    hist(res4,xn);
    xn = min(res5):delta:max(res5);
    figure('Name','Final Result for N=5');
    hist(res5,xn);
    xn = min(res10):delta:max(res10);
    figure('Name','Final Result for N=10');
    hist(res10,xn);
    
    %for N = 100
    y100=-log(rand(100,len))./lambda;
    res100 = ((sum(y100)/100) - mean(yA))*sqrt(100);
    xn = min(res100):delta:max(res100);
    figure('Name','Final Result for N=100');
    hist(res100,xn);
    

    【讨论】:

    • 好吧,添加后,y3 的直方图和结果的形状相同,但 y3 和结果的方差和均值似乎不一样...
    • @Arashdn 我已经为你添加了一些 cmets 和一些额外的代码。希望它能让你更清楚
    • 不错的答案。我只想添加以下内容:首先,Matlab 永远不会成为演示此类事情的工具,它只是向您展示它适用于某些数据集。这不是证据,只是一个线索。其次,计算机机器是有限且离散的机器,它们可以生成看起来像从某些分布中提取的随机变量的序列,但它们不能生成真正的随机独立值,因此 IID 假设可能不成立。无论如何,Matlab 或 Octave 都是很好的工具,我们只需要记住它们的局限性。
    • 完全同意你的看法。目的不是为了展示任何东西。使用数值编程进行数学演示是没有意义的,但是 matlab 非常适合将结果可视化并获得事物的直觉(例如 CLT)。
    猜你喜欢
    • 2011-10-27
    • 2017-03-11
    • 2012-02-21
    • 1970-01-01
    • 2020-04-06
    • 2021-02-11
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多