2013-01-15 6 views
19

J'ai deux vecteurs:Corrélation entre 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 pouvais soustraire à chaque valeur de la moyenne du vecteur et de le faire:

A_1' * A_2 

Y at-il de meilleures façons?

+2

Que voulez-vous dire par "mieux?" –

+0

Vous pouvez faire une régression linéaire entre les deux et vérifier la valeur au carré de 'r'. – ja72

+1

@ ja72: Postez-le comme une réponse, avec un exemple de code s'il vous plaît. Donnez à cette question une chance d'être sauvé. –

Répondre

21

Vu:

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, plus évidemment corr:

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

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

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

Qui est proche ment liée à la fonction cov:

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

Comme vous obtenez presque dans votre question initiale, vous pouvez redimensionner et ajuster les vecteurs vous-même si vous voulez, ce qui donne une compréhension un peu mieux ce qui se passe . Tout d'abord créer 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 

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 aussi fonctionner

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

Et il le fait. Je crois, mais je n'ai pas l'énergie de confirmer pour le moment, que le même calcul peut être utilisé pour calculer des termes de corrélation et de corrélation croisée quand il s'agit d'entrées multidimensionnelles, à condition de prendre soin de dimensions et orientations des réseaux d'entrée.

+1

-1..1. Zéro signifie aucune corrélation. 1 corrélation maximale (cela signifie que vous pouvez faire un vecteur de l'autre en utilisant un facteur d'échelle positif). -1 corrélation négative max (cela signifie que vous pouvez faire un vecteur de l'autre en utilisant un facteur d'échelle négatif). – Pursuit

+0

Rien de dur. Pour commencer, à partir de http://en.wikipedia.org/wiki/Correlation_and_dependence, "la corrélation ne peut pas dépasser 1 en valeur absolue". – Pursuit

10

Essayez xcorr, il est une fonction intégrée dans MATLAB pour le contre-corrélation:

c = xcorr(A_1, A_2); 

Toutefois, notez qu'il nécessite l'Signal Processing Toolbox installé. Sinon, vous pouvez regarder dans la commande corrcoef à la place.

+0

pourquoi ne pas utiliser corr normal? –

+4

@DennisJaheruddin Boîte à outils différente ... pomme de terre, potaato. –

6

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

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

Notez que vous pouvez aussi utiliser

corr(A_1, A_2) 

Mais les garanties d'indexation linéaire que vos vecteurs ne ont pas besoin être transposé.

+0

+1: Vous devez mentionner que cela nécessite la boîte à outils de statistiques si :) –

6

Pour effectuer une régression linéaire entre les 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

Questions connexes