2016-03-14 28 views
6

Sto cercando di trovare distance correlation tra le colonne, guarda il codice qui sotto. La maggior parte del tempo ritorna superiore a 1 risultato, il che non è possibile, poiché la correlazione della distanza è compresa tra 0 e 1. È possibile leggere la correlazione della distanza di scipy here.Scipy: la correlazione della distanza è superiore a 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

Qual è il problema qui o come posso misurarla?

UPD1:Link to issue su github

+0

Sembra strano. L'ho provato in R usando il pacchetto energia e finisco sempre con valori intorno a 0.49, quindi sembra che manchi un fattore 0.5. Nessun indizio ... potrebbe valere la pena aprire un problema nella loro pagina github. – Cleb

+0

@Cleb, Certo, aprirò un problema – Rocketq

+0

@Rocketq: perché pensi che la funzione calcoli la distanza di correlazione --- la documentazione dice che sta calcolando la distanza di correlazione --- che forse è una cosa completamente diversa? –

risposta

4

non vedo il motivo per cui questo è un problema secondo la documentazione.

Dal documentation:

La distanza correlazione tra uev, è definita come 1 - \ frac {(u - \ bar {u}) \ cdot (v - \ bar {v})} {{|| (u - \ bar {u}) ||} {_2 || (v - \ bar {} v) ||}} _2

A Cauchy-Schwarz Inequality, l'espressione il seguente segno meno ha un valore assoluto che è al massimo 1. Non c'è nulla che stabilisca che non sarà negativo, tuttavia - in effetti ciò avverrà se i vettori (mediamente normalizzati) sono anticorrelati.

AFAICT, dovresti essere sorpreso se otterresti un valore superiore a 2 o inferiore a 0. Usando il commento di @Cleb e il fatto che l'intervallo è [0, 2], suppongo che alcuni altri pacchetti definiscono semplicemente la distanza come mezzo questa espressione.

+0

Potrebbe essere che scipy definisca il termine nell'altro modo, ma leggi proprietà - la distanza non può essere inferiore a 0 – Rocketq

+1

@Rocketq Non vedo come possa produrre qualcosa di meno di 0, infatti. –

+1

scipy sta usando la correlazione di Pearson. La correlazione è una misura di somiglianza, quindi per utilizzarla come misura di distanza, calcola 1-p. Quello nel riferimento è una modifica della correlazione di Pearson che dovrebbe rilevare anche le relazioni non lineari. Quindi, sono completamente diversi. – ayhan

1

@ josef-pkt s' risposta su github è il seguente:

Non una correlazione distanza che è una misura lineare di dipendenza. per esempio. my take http://jpktd.blogspot.ca/2012/06/non-linear-dependence-measures-distance.html Tuttavia, "correlazione" in scipy.spatial.distance.correlation è un po 'ingannevole perché, secondo la formula nella docstring, è una misura di distanza e non una correlazione. perfettamente correlata con coefficiente di correlazione uguale a 1 ha distanza zero perfettamente negativamente correlata con coefficiente di correlazione pari a -1 trovi distanza massima a 2.

0

distanza Correlational è l'inverso di correlazione e solo guarda l'angolo/somiglianza tra modelli (sorta di normalizzazione simile). La distanza di correlazione va da 0 a 2, dove 0 è la correlazione PERFETTA, 1 non è correlata e 2 è l'ANTICORRELAZIONE PERFETTA. Quindi un piccolo valore di distanza correlazionale significa vicino nello spazio correlazionale (piccola differenza angolare). Corr = 1 - dist; Corr dist = 1 - corr; così mentre una correlazione alta = alta relazione; LOW CORR DISTINANCE = alta relazione