两个向量之间的相关性?

22

我有两个向量:

A_1 = 

      10
      200
      7
      150

A_2 = 
      0.001
      0.450
      0.0007
      0.200

我想知道这两个向量之间是否有相关性。

我可以从每个值中减去向量的平均值,然后进行如下操作:

  A_1' * A_2

还有更好的方法吗?


2
你所说的“better”是什么意思? - Robert Harvey
你可以对两者进行线性回归,并检查r平方值。 - John Alexiou
1
@ja72:请将其作为答案发布,附上示例代码。让这个问题有一些被解决的机会。 - Robert Harvey
还有相关的帖子:http://stackoverflow.com/q/8416968/380384 - John Alexiou
@ja72:如果你能的话,在Robert之后发表一个答案。 - dynamic
4个回答

27

假设:

A_1 = [10 200 7 150]';
A_2 = [0.001 0.450 0.007 0.200]';

(正如其他人已经指出的)有一些工具可以简单地计算相关性,最明显的是 corr

corr(A_1, A_2);  %Returns 0.956766573975184  (Requires stats toolbox)

您也可以使用基础的Matlab corrcoef函数,如下所示:

M = corrcoef([A_1 A_2]):  %Returns [1 0.956766573975185; 0.956766573975185 1];
M(2,1);  %Returns 0.956766573975184 

这与 cov 函数密切相关:

cov([condition(A_1) condition(A_2)]);

正如您在原问题中提到的,如果需要,您可以自己缩放和调整向量,这会使情况稍微清晰一些。首先创建一个条件函数,该函数将减去平均值并除以标准差:

condition = @(x) (x-mean(x))./std(x);  %Function to subtract mean AND normalize standard deviation

那么相关性似乎是(A_1 * A_2)/(A_1^2),如下所示:

(condition(A_1)' * condition(A_2)) / sum(condition(A_1).^2);  %Returns 0.956766573975185

根据对称性,这也应该有效。

(condition(A_1)' * condition(A_2)) / sum(condition(A_2).^2); %Returns 0.956766573975185

没错。

我相信,在处理多维输入时,可以使用相同的数学方法来计算相关性和交叉相关性术语,只要在处理输入数组的尺寸和方向时小心处理即可。但我现在没有精力进行确认。


1
-1到1之间的数值。零表示没有相关性。1表示最大相关性(这意味着您可以使用正比例因子从另一个向量创建一个向量)。-1表示最大负相关性(这意味着您可以使用负比例因子从另一个向量创建一个向量)。 - Pursuit
很简单。作为一个开始,从http://en.wikipedia.org/wiki/Correlation_and_dependence,“相关性的绝对值不能超过1”。 - Pursuit

10

试试使用xcorr,这是MATLAB中用于交叉相关的内置函数:

c = xcorr(A_1, A_2);

然而,请注意它需要安装信号处理工具箱。如果没有安装,您可以考虑使用corrcoef命令。


4
@DennisJaheruddin 不同的工具箱...马铃薯,土豆,两者都可以。 - Eitan T

7

对于相关性计算,你可以直接使用corr函数(统计工具箱)。

corr(A_1(:), A_2(:))

请注意,您也可以直接使用。
corr(A_1, A_2)

但是线性索引保证了您的向量不需要转置。


+1:你应该提到这需要统计工具箱 :) - Eitan T

6
要在两个向量x和y之间执行线性回归,请按照以下步骤进行:
[p,err] = polyfit(x,y,1);   % First order polynomial
y_fit = polyval(p,x,err);   % Values on a line
y_dif = y - y_fit;          % y value difference (residuals)
SSdif = sum(y_dif.^2);      % Sum square of difference
SStot = (length(y)-1)*var(y);   % Sum square of y taken from variance
rsq = 1-SSdif/SStot;        % Correlation 'r' value. If 1.0 the correlelation is perfect

对于 x=[10;200;7;150]y=[0.001;0.45;0.0007;0.2],我得到了rsq = 0.9181
参考网址:http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接