我有两个向量:
A_1 =
10
200
7
150
A_2 =
0.001
0.450
0.0007
0.200
我想知道这两个向量之间是否有相关性。
我可以从每个值中减去向量的平均值,然后进行如下操作:
A_1' * A_2
还有更好的方法吗?
我有两个向量:
A_1 =
10
200
7
150
A_2 =
0.001
0.450
0.0007
0.200
我想知道这两个向量之间是否有相关性。
我可以从每个值中减去向量的平均值,然后进行如下操作:
A_1' * A_2
还有更好的方法吗?
假设:
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
没错。
我相信,在处理多维输入时,可以使用相同的数学方法来计算相关性和交叉相关性术语,只要在处理输入数组的尺寸和方向时小心处理即可。但我现在没有精力进行确认。
对于相关性计算,你可以直接使用corr函数(统计工具箱)。
corr(A_1(:), A_2(:))
corr(A_1, A_2)
但是线性索引保证了您的向量不需要转置。
[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
。
r
平方值。 - John Alexiou