2013-01-15 15 views
19

Mam dwa wektory:Korelacja między dwoma wektorami?

A_1 = 

     10 
     200 
     7 
     150 

A_2 = 
     0.001 
     0.450 
     0.0007 
     0.200 

chciałbym wiedzieć, czy istnieje korelacja pomiędzy tymi dwoma wektorami.

mogę odjąć do każdej wartości średniej wektora i niż zrobić:

A_1' * A_2 

Czy są jakieś lepsze sposoby?

+2

Co masz na myśli –

+0

Możesz przeprowadzić regresję liniową między tymi dwoma i sprawdzić wartość r "r". – ja72

+1

@ ja72: Opublikuj jako odpowiedź, z przykładowym kodem. Daj temu pytaniu szansę na ocalenie. –

Odpowiedz

21

Dane:

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

(Jak inni już wspomniano) Istnieją narzędzia, które po prostu obliczać korelację, najbardziej oczywiście corr:

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

Można również użyć corrcoef funkcji bazowej Matlab, podobnie jak to:

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

Który jest blisko ly związane z funkcją cov:

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

Jak prawie dostać się w oryginalne pytanie, można przeskalować i dostosować wektory siebie, jeśli chcesz, co daje nieco lepsze zrozumienie tego, co się dzieje . Najpierw utworzyć funkcję stanu, który odejmuje średnią i dzieli przez odchylenie standardowe:

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

pojawi korelacja być (a_1 * A_2)/(a_1^2) w następujący sposób:

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

Dzięki symetrii, to powinno również pracować

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

I to robi.

Wierzę, ale nie mam teraz siły, by potwierdzić, że ta sama matematyka może być użyta do obliczenia korelacji i warunków korelacji krzyżowej w kontaktach z wielowymiarowymi danymi wejściowymi, o ile zachowana zostanie ostrożność podczas obsługi wymiary i orientacje macierzy wejściowych.

+1

-1..1. Zero oznacza brak korelacji. 1 maks. Korelacja (oznacza to, że można wykonać jeden wektor z drugiego przy użyciu dodatniego współczynnika skali). -1 maks. Korelacja ujemna (co oznacza, że ​​można wykonać jeden wektor z drugiego przy użyciu ujemnego współczynnika skali). – Pursuit

+0

Nic trudnego. Na początek, z http://en.wikipedia.org/wiki/Correlation_and_dependence, "korelacja nie może przekroczyć 1 w wartości bezwzględnej". – Pursuit

10

Spróbuj xcorr, to funkcja wbudowana w programie MATLAB dla wzajemnej korelacji:

c = xcorr(A_1, A_2); 

Należy jednak pamiętać, że wymaga się Signal Processing Toolbox zainstalowany. Jeśli nie, zamiast tego możesz sprawdzić komendę corrcoef.

+0

dlaczego nie użyć regularnego corr? –

+4

@DennisJaheruddin Różny zestaw narzędzi ... ziemniaków, potaato. –

6

korelacji można po prostu użyć funkcji corr (statystyki przybornika)

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

Pamiętaj, że możesz też po prostu użyć

corr(A_1, A_2) 

ale liniowych gwarancje indeksujących, że wektory nie potrzeba do transpozycji.

+0

+1: Powinieneś wspomnieć, że to wymaga skrzynki narzędzi statystycznych :) –

6

Aby przeprowadzić regresji liniowej między dwoma wektorami x i y następujące etapy:

[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 

Na x=[10;200;7;150] i y=[0.001;0.45;0.0007;0.2] uzyskać rsq = 0.9181.

Przekierowanie: „lepiej” http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html

Powiązane problemy