【问题标题】:Correlation between two random signals changes each time it is calculated每次计算两个随机信号之间的相关性都会发生变化
【发布时间】:2015-12-29 12:15:57
【问题描述】:

我在 MATLAB 中有两个信号,比如说

a = randn(1,1e6);
b = randn(1,1e6);

我发现它们之间的相关性如下:

R=corrcoef(a,b);
r = R(2,1);

现在每次我运行我的代码,相关系数都是不同的。我什至尝试增加样本数量(从1e6 到更高的值),但这没有用。有没有其他方法可以找到这些信号之间的相关系数?

【问题讨论】:

    标签: matlab signals signal-processing correlation


    【解决方案1】:

    您似乎将样本相关系数与理论相关系数混淆了。前者是一个随机值,由模拟中产生的(随机)信号产生;后者是一个数字,它是从信号生成过程的统计模型中计算出来的。

    您在代码中计算的是 sample 相关系数,它取决于随机生成的实际信号(代码中的ab)。这些信号是随机过程实现(在你的例子中是白色高斯过程,因为你使用randn)。

    另一方面,理论相关系数由随机过程的统计表征决定,这些随机过程会产生您生成的两个随机过程的信号。所以它不是从模拟中获得的(如在您的代码中),而是通过数学计算得出的。

    您的情况下的理论相关性为 0,因为随机过程是独立的。请注意,我知道这一点 来自代码(来自 如何你生成信号),而不是来自代码碰巧生成的实际值。这就是我所说的理论值的意思:它是根据您对如何生成实际信号的了解计算得出的。

    样本相关性可以作为理论相关性的估计;并且随着信号大小的增加,估计会变得更好。这是law of large numbers。因此,您设置的样本量越大(代码中的1e6),结果(样本相关系数)就越集中在0(理论相关系数)附近。

    为了说明这一点,我做了101000 模拟,每组都有不同的样本量。因此,对于每个样本量,我收集1000 样本相关系数的不同值并计算 直方图 以查看这些值的分布情况。该图证实,随着样本量的增加,直方图变窄(变高),说明样本相关系数更集中在理论值 0 附近。


    生成图形的代码(Matlab R2015b)为:

    S = 1e5:1e5:1e6; %// sample sizes
    N = 1000; %// number of repetitions to generate histogram
    binlimits = [-.015 .015]; %// set manually depending on S
    B = 31; %// number of bins in the histogram
    stretch = 7; %// stretch factor for plotting the histograms
    result = NaN(numel(S),B); %// preallocate
    for m = 1:numel(S)
        cc = NaN(1,S(m));
        for n = 1:N
            a = randn(1,S(m));
            b = randn(1,S(m));
            c = corrcoef(a,b);
            cc(n) = c(2,1); %// correlation coefficient
        end
        [hist, edges] = histcounts(cc,31,'BinLimits',binlimits,'Normalization','pdf');
        result(m,:) = hist; %// histogram of correlation coefficient for this sample size
    end
    bins = (edges(1:end-1) + edges(2:end))/2; %// axis for plotting the histograms
    resultbar = NaN(numel(S)*stretch,B);
    resultbar(1:stretch:end,:) = result; %// separate the histograms for better visualization
    h = bar3(bins, resultbar.'); %'// plot histograms
    set(gca,'xtick',1:stretch:numel(h),'xticklabels',S)
    delete(h(mod(0:numel(h)-1,stretch)>0)) %// remove zeros
    xlabel('Sample correlation coefficient')
    ylabel('Sample size')
    

    【讨论】:

    • 如果我可以反过来解释:总会有一个非零概率,无论您采用何种样本量,您的两个样本都将完全相关(相关系数为 1无处不在),即使当您的样本量趋于无穷大时这个概率趋于零
    • 无法从数据中计算出理论上的相关性。两个随机变量 X 和 Y 之间的理论相关性定义为: Cor(X,Y)=Cov(X,Y)/(SDx*SDy) 其中 SDx (resp. SDy) 是变量 X (resp. .Y)。在这里,您实际上可以计算理论相关性,因为您的 2 个变量是独立的(正如@Luis Mendo 在他的回答中所说),导致 Cov(X,Y)=0 ,这意味着您的理论相关性为 0。
    • 1) 你会计算一个 empirical '在此处插入术语',而不是一个理论值(请记住,如果你从数据中计算某些东西,你永远不会计算一些理论上的东西)2)相关性不是这样计算的,你必须使用正确的公式:(见样本相关系数
    • 很好地解释了@Luis Mendo 和@BillBokeey!谢谢你:)
    • 好问题。该系数确实可以是复数,并且当它(是实数并且)等于1 时,可以实现最大相似性。但是对于系数的其他值,我不确定实部或模数是否更有意义。我一般取模数(绝对值)
    【解决方案2】:

    randn 的编程方式是每次调用它时默认情况下不会产生相同的结果。如果您想在每次调用脚本时为变量ab 生成相同的随机数集,则必须通过相应地设置随机生成器来告诉Matlab。 我用嵌套函数call_randn 编写了一个小函数test 来说明这一点。 test 调用随机生成器 3 次,您会看到它为所有 3 次调用生成相同的 r。但是,无论您何时拨打test,这些号码都会有所不同。

    %// test
    function r = test()
        rng('default')  %// Initialise random generator.
        sa = rng;       %// Store current generator settings in sa.
        rng('shuffle')  %// Get new generator settings.
        sb = rng;       %// Store new generator settings in sb.
        n = 10;         %// Number of random numbers to be generated.
    
        for i = 1:3
            [a(i,1:n),b(i,1:n)] = call_randn(sa,sb,n);
            R=corrcoef(a,b);
            r(i) = R(2,1);
        end
    end
    
    function [a,b] = call_randn(sa,sb,n)
        rng(sa);         %// Load generator settings.
        a = randn(1,n);
        rng(sb);         
        b = randn(1,n);
    end
    

    【讨论】:

      【解决方案3】:

      您应该设置随机数生成器的种子,否则每次调用 randn 都会获得不同的分布。 检查randn。在其中一个示例中,随机状态被保存,并且每次调用 randn 时,他都预先将随机状态设置为保存的状态,获得相同的分布:

      s = rng;
      r = randn(1,5)
      r =
      -0.0245   -1.9488    1.0205    0.8617    0.0012
      rng(s);
      r1 = randn(1,5)
      r1 =
      -0.0245   -1.9488    1.0205    0.8617    0.0012
      

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多