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 y a une corrélation entre ces deux vecteurs.

<!-Je pourrais soustraire à chaque valeur la moyenne du vecteur et que faire:

  A_1' * A_2

existe-il des meilleures façons?

19
demandé sur Shai 2013-01-15 21:07:02

4 réponses

étant 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 simplement calculer la corrélation, bien évidemment corr:

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

vous pouvez aussi utiliser les bases Matlab's corrcoef fonction, 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 à l' cov fonction:

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

comme vous arrivez presque à dans votre question originale, vous pouvez mettre à l'échelle et ajuster les vecteurs vous-même si vous voulez, ce qui donne un légèrement meilleure compréhension de ce qui se passe. Créer 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

alors 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 c'est le cas.

je crois, mais je n'ai pas l'énergie pour confirmer maintenant, que le même calcul peut être utilisé pour calculer la corrélation et le croisement termes de corrélation lorsqu'il s'agit d'entrées multidimensionnelles, dans la mesure où l'on prend soin de gérer les dimensions et les orientations des ensembles d'entrées.

22
répondu Pursuit 2013-01-15 20:55:42

xcorr, c'est une fonction intégrée dans MATLAB pour le cross-corrélation:

c = xcorr(A_1, A_2);

cependant, notez qu'il nécessite le Boîte À Outils Pour Le Traitement Des Signaux installé. Si non, vous pouvez regarder dans le corrcoef commander à la place.

10
répondu Eitan T 2013-01-15 17:21:13

pour les 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)
6
répondu Dennis Jaheruddin 2013-01-15 17:28:34

Pour effectuer une régression linéaire entre deux vecteurs x et y suivez ces étapes:

[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] et y=[0.001;0.45;0.0007;0.2] je rsq = 0.9181.

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

6
répondu ja72 2013-01-15 17:44:22