web-dev-qa-db-fra.com

Corrélation entre deux vecteurs?

J'ai deux vecteurs:

A_1 = 

      10
      200
      7
      150

A_2 = 
      0.001
      0.450
      0.0007
      0.200

Je voudrais savoir s'il existe une corrélation entre ces deux vecteurs.

Je pourrais soustraire à chaque valeur la moyenne du vecteur et que:

  A_1' * A_2

Y a-t-il de meilleures façons?

19
dynamic

Donné:

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

(Comme d'autres l'ont déjà souligné) Il existe des outils pour calculer simplement la corrélation, le plus évidemment corr:

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

Vous pouvez également utiliser la fonction corrcoef de base de Matlab, comme ceci:

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

Qui est étroitement liée à la fonction cov:

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

Comme vous y êtes presque arrivé dans votre question d'origine, vous pouvez mettre à l'échelle et ajuster les vecteurs vous-même si vous le souhaitez, ce qui donne une meilleure compréhension de ce qui se passe. Créez d'abord une fonction de condition qui soustrait la moyenne et divise par l'écart-type:

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

Ensuite, la corrélation semble être (A_1 * A_2)/(A_1 ^ 2), comme ceci:

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

Par symétrie, cela devrait également fonctionner

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

Et c'est le cas.

Je crois, mais je n'ai pas l'énergie pour confirmer pour le moment, que les mêmes calculs peuvent être utilisés pour calculer les termes de corrélation et de corrélation croisée lorsqu'ils traitent avec des entrées multi-dimensiotnales, tant que l'on prend soin de manipuler les dimensions et les orientations de les tableaux d'entrée.

23
Pursuit

Essayez xcorr, c'est une fonction intégrée dans MATLAB pour la corrélation croisée:

c = xcorr(A_1, A_2);

Cependant, notez qu'il nécessite l'installation de Signal Processing Toolbox . Sinon, vous pouvez plutôt rechercher la commande corrcoef .

10
Eitan T

Pour les corrélations, vous pouvez simplement utiliser la fonction corr (boîte à outils statistiques)

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

Notez que vous pouvez également simplement utiliser

corr(A_1, A_2)

Mais l'indexation linéaire garantit que vos vecteurs n'ont pas besoin d'être transposés.

6
Dennis Jaheruddin

Pour effectuer une régression linéaire entre deux vecteurs x et y, procédez comme suit:

[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

Pour x=[10;200;7;150] et y=[0.001;0.45;0.0007;0.2] Je reçois rsq = 0.9181.

URL de référence: http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html

6
ja72