2016-03-14 33 views
6

Próbuję znaleźć distance correlation między kolumnami, spójrz na poniższy kod. Większość czasu zwraca wynik wyższy niż 1, co nie jest możliwe, ponieważ korelacja odległości wynosi od 0 do 1. Można przeczytać o korelacji odległości scipy here.Scipy: korelacja odległości jest większa niż 1

import numpy as np 
from scipy.spatial import distance 

x = np.random.uniform(-1, 1, 10000) 
print distance.correlation(x, x**2) 

1,00210811815

Co tu jest źle i jak mogę go zmierzyć?

upd1:Link to issue na github

+0

To wygląda dziwnie. Próbowałem go w R używając pakietu energetycznego i zawsze kończyłem z wartościami około 0.49, więc wydaje się, że brakuje współczynnika 0,5. Nie ma pojęcia ... może warto otworzyć problem na ich stronie github. – Cleb

+0

@Cleb, Pewnie, otworzę numer – Rocketq

+0

@Rocketq: dlaczego myślisz, że funkcja ma obliczać korelację odległości --- dokumentacja mówi, że oblicza odległość korelacji --- która może jest zupełnie inna? –

Odpowiedz

4

nie widzę dlaczego jest to problem zgodnie z dokumentacją.

Z documentation:

Odległość korelacja pomiędzy U i V, są zdefiniowane jako 1 - \ frac {(U - \ pręt {u}) \ cdot (v - \ bar {v},)} {{|| (U - \ pręt {u}) ||} _2 {|| (v - \ {v}, bar) ||} _2}

w Cauchy-Schwarz Inequality wyrażenie podążając za znakiem minus ma wartość bezwzględną , która wynosi co najwyżej 1. Nic nie wskazuje na to, że nie będzie ona negatywna - w rzeczywistości stanie się tak, jeśli (średnie znormalizowane) wektory są antykorelowane.

AFAICT, powinieneś być zaskoczony, jeśli uzyskasz wartość większą niż 2 lub mniejszą niż 0. Używając komentarza @Cleb i faktu, że zakres wynosi [0, 2], zgaduję, że niektóre inne pakiety po prostu określają odległość jako pół tego wyrażenia.

+0

Możliwe, że scipy definiują to pojęcie w inny sposób, ale odczytaj właściwości - odległość nie może być mniejsza niż 0 – Rocketq

+1

@Rocketq Nie widzę, w jaki sposób może on wyprowadzić cokolwiek mniej niż 0. –

+1

scipy używa korelacji Pearsona. Korelacja jest miarą podobieństwa, więc aby użyć jej jako miary odległości, oblicza 1-p. Ten w odnośniku jest modyfikacją korelacji Pearsona, która ma również wykrywać relacje nieliniowe. Są więc zupełnie inne. – ayhan

1

@ Josef-PKT jest odpowiedź na github jest podany poniżej:

To nie jest korelacja odległość, która jest nieliniowa miarą uzależnienia. na przykład mój wziąć http://jpktd.blogspot.ca/2012/06/non-linear-dependence-measures-distance.html Jednak "korelacja" w scipy.spatial.distance.correlacja jest nieco myląca, ponieważ zgodnie ze wzorem w docstringu jest to miara odległości, a nie korelacja. doskonale skorelowane ze współczynnikiem korelacji równy 1 ma niezerową odległość doskonale ujemnie skorelowany z współczynnik korelacji równy -1 ma maksymalną odległość na 2.

0

korelacyjnej odległości jest odwrotną korelację i tylko patrzy pod kątem/podobieństwo między wzorami (coś w rodzaju normalizacji). Odległość korelacji wynosi od 0 do 2, przy czym 0 oznacza korelację PERFEKCYJNĄ, 1 oznacza brak korelacji, a 2 oznacza PERFEKCYJNĄ ANTYKOROZYWACJĘ. Tak więc mała wartość odległości korelacyjnej oznacza blisko siebie w przestrzeni korelacyjnej (mała różnica kątowa). Corr = 1 - dist; Corr dist = 1 - corr; tak, podczas gdy wysoka korelacja = wysoki związek; DEKLARACJA NISKICH KOREK = wysoki stosunek