22

我有两个向量:

A_1 = 

      10
      200
      7
      150

A_2 = 
      0.001
      0.450
      0.0007
      0.200

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

我可以从每个值中减去向量的平均值,然后:

  A_1' * A_2

有没有更好的方法?

4

4 回答 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

它确实如此。

我相信,但现在没有精力确认,在处理多维输入时,可以使用相同的数学计算相关和互相关项,只要在处理维度和方向时要小心输入数组。

于 2013-01-15T17:41:26.137 回答
10

试试看xcorr,它是 MATLAB 中用于互相关的内置函数:

c = xcorr(A_1, A_2);

但是,请注意,它需要安装信号处理工具箱。如果没有,您可以查看corrcoef命令。

于 2013-01-15T17:13:44.887 回答
7

对于相关性,您可以只使用 corr 函数(统计工具箱)

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

请注意,您也可以只使用

corr(A_1, A_2)

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

于 2013-01-15T17:20:08.043 回答
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

于 2013-01-15T17:44:22.563 回答