2013-01-15 88 views
19

ho due vettori:Correlazione tra due vettori?

A_1 = 

     10 
     200 
     7 
     150 

A_2 = 
     0.001 
     0.450 
     0.0007 
     0.200 

Vorrei sapere se v'è correlazione tra questi due vettori.

ho potuto sottrarre ad ogni valore la media del vettore e di fare:

A_1' * A_2 

Ci sono modi migliori?

+2

Cosa intendi con "migliore?" –

+0

È possibile eseguire una regressione lineare tra i due e controllare il valore quadrato 'r'. – ja72

+1

@ ja72: pubblicalo come risposta, con il codice di esempio per favore. Dai a questa domanda qualche possibilità di essere salvato. –

risposta

21

Data:

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

(Come altri hanno già fatto notare) Ci sono strumenti per calcolare semplicemente la correlazione, il più evidente corr:

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

è anche possibile utilizzare la funzione di base di Matlab corrcoef, come this:

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

Quale è vicino LY in relazione alla funzione cov:

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

Come quasi arriva a nella tua domanda iniziale, è possibile scalare e regolare i vettori da soli se si vuole, che dà un po 'migliore comprensione di ciò che sta accadendo . Innanzitutto creare una funzione condizione che sottrae la media, e divide per la deviazione standard:

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

Appare quindi la correlazione di essere (A_1 * A_2)/(A_1^2), in questo modo:

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

Per simmetria, questo dovrebbe funzionare anche

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

E lo fa.

Credo, ma non ho l'energia per confermare in questo momento, che la stessa matematica può essere usata per calcolare i termini di correlazione e di correlazione incrociata quando si tratta di input multi-dimensiotnal, a patto che si prenda cura quando si maneggia il dimensioni e orientamenti degli array di input.

+1

-1..1. Zero significa nessuna correlazione. 1 correlazione massima (ciò significa che puoi fare un vettore dall'altro usando un fattore di scala positivo). -1 correlazione negativa massima (ciò significa che è possibile creare un vettore dall'altro utilizzando un fattore di scala negativo). – Pursuit

+0

Niente di difficile. Per iniziare, da http://en.wikipedia.org/wiki/Correlation_and_dependence, "la correlazione non può superare 1 in valore assoluto". – Pursuit

10

Prova xcorr, si tratta di una funzione built-in in MATLAB per il cross-correlazione:

c = xcorr(A_1, A_2); 

Si noti tuttavia che richiede la Signal Processing Toolbox installato. In caso contrario, è possibile esaminare invece il comando corrcoef.

+0

perché non utilizzare corr regolare? –

+4

@DennisJaheruddin Diversi strumenti ... patate, potaato. –

6

Per correlazioni si può semplicemente utilizzare la funzione corr (Statistics Toolbox)

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

noti che è possibile anche semplicemente usare

corr(A_1, A_2) 

Ma le garanzie di indicizzazione lineari che i vettori non hanno bisogno essere trasposto

+0

+1: dovresti menzionare che ciò richiede la casella degli strumenti delle statistiche però :) –

6

Per eseguire una regressione lineare tra due vettori x e y attenersi alla seguente procedura:

[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 

Per x=[10;200;7;150] e y=[0.001;0.45;0.0007;0.2] ottengo rsq = 0.9181.

URL di riferimento: http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html

Problemi correlati