matlab - 每次计算时,两个随机信号之间的相关性都会发生变化

标签 matlab signals signal-processing correlation

假设我在 MATLAB 中有两个信号

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

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

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

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

最佳答案

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

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

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

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

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

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

enter image description here


用于生成图(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')

关于matlab - 每次计算时,两个随机信号之间的相关性都会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32887637/

相关文章:

c - 来自内核的 SIGSEGV

c - C 中的信号处理

audio - 来自麦克风的 OpenAL 实时音频处理

matlab - 仅向耳机的一侧发送音调

windows - 如何使用 MATLAB 中的 Cygwin 执行其他目录中的命令?

matlab - 计算矩阵中的唯一行

matlab - 将matlab中 map 上的点与地球曲率连接起来

matlab - 不等间隔时间序列的移动平均线

bash - 确定进程是否被 bash 中的信号杀死

linux - 如何使用 sox 或其他 linux 命令行工具创建脉冲序列 .wav