假设我在 MATLAB 中有两个信号
a = randn(1,1e6);
b = randn(1,1e6);
我发现它们之间的相关性如下:
R=corrcoef(a,b);
r = R(2,1);
现在每次运行我的代码时,相关系数都不同。我什至尝试增加样本数量(从 1e6
到更高的值),但这没有用。有没有其他方法可以找到这些信号之间的相关系数?
最佳答案
您似乎混淆了样本 相关系数和理论 相关系数。前者是随机值,由在模拟中生成的(随机)信号产生;后者是一个数字,它是根据信号生成过程的统计模型计算得出的。
您在代码中计算的是样本相关系数,它取决于随机生成的实际信号(a
和b
在你的代码中)。这些信号是随机过程的实现(白色高斯过程,在你的例子中,因为你使用 randn
)。
另一方面,理论相关系数由随机过程的统计特征决定,这些随机过程会产生两个随机过程的生成信号。所以它不是从模拟中获得的(如在您的代码中),而是通过数学计算。
在您的案例中,理论相关性为 0,因为随机过程独立。请注意,我从代码(从您如何生成信号)知道这个,而不是从代码碰巧生成的实际值。这就是我所说的理论值的意思:它是根据您对如何生成实际信号的了解计算得出的。
样本相关性可以用作理论相关性的估计;随着信号大小的增加,这种估计变得更好。这是law of large numbers .因此,您设置的样本量越大(代码中的 1e6
),结果(样本相关系数)就越集中于 0
(理论相关系数)附近。
为了说明这一点,我进行了 10
组 1000
模拟,每组具有不同的样本大小。因此,对于每个样本大小,我收集了 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')
关于matlab - 每次计算时,两个随机信号之间的相关性都会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32887637/