2016-03-14 9 views
6

Ich versuche distance correlation zwischen den Spalten zu finden, schauen Sie sich den unten stehenden Code. Die meiste Zeit ist es höher als 1 Ergebnis, was nicht möglich ist, da die Distanzkorrelation zwischen 0 und 1 liegt. Sie können über die Distanzkorrelation von scipy lesen here.Scipy: Abstand Korrelation ist höher als 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

Was ist hier falsch oder wie kann ich es messen?

UPD1:Link to issue auf Github

+0

Das sieht komisch aus. Ich habe es in R mit dem Energiepaket ausprobiert und habe immer Werte um 0.49, so scheint es, dass ein Faktor 0,5 fehlt. Keine Ahnung ... wäre es vielleicht wert, ein Problem auf ihrer GitHub-Seite zu öffnen. – Cleb

+0

@Cleb, Sicher, ich werde ein Problem öffnen – Rocketq

+0

@ Rocketq: Warum denkst du, dass die Funktion Distanzkorrelation berechnen soll --- die Dokumentation sagt, es ist Rechenkorrelationsentfernung --- was ist vielleicht eine ganz andere Sache? –

Antwort

4

Ich sehe nicht, warum dies ein Problem nach der Dokumentation.

Vom documentation:

Der Korrelationsabstand zwischen U und V, ist definiert als 1 - \ frac {(u - \ bar {u}) \ cdot (v - \ bar {v})} { {|| (u - \ bar {u}) || _2} {|| (v - \ bar {v}) ||}} _2

Durch die Cauchy-Schwarz Inequality der Ausdruck Nach dem Minuszeichen hat einen absoluten Wert, der höchstens 1 ist. Es gibt nichts, was vorschreibt, dass es nicht negativ sein wird, obwohl dies tatsächlich geschehen wird, wenn die (normalisierten) Vektoren antikorreliert sind.

AFAICT, Sie sollten überrascht sein, wenn Sie einen Wert größer als 2 oder kleiner als 0 erhalten würden. Mit dem Kommentar von @Cleb und der Tatsache, dass der Bereich [0, 2] ist, vermute ich, dass einige andere Pakete definieren einfach die Entfernung als halb dieser Ausdruck.

+0

Es könnte sein, dass scipy den Begriff auf die andere Weise definieren, aber lesen Sie die Eigenschaften - Abstand kann nicht weniger als 0 – Rocketq

+1

@ Rocketq Ich sehe nicht, wie es etwas weniger als 0, tatsächlich ausgeben kann. –

+1

scipy verwendet die Pearson-Korrelation. Die Korrelation ist ein Maß für die Ähnlichkeit. Um sie als Abstandsmaß zu verwenden, berechnet sie 1-p. Der eine in der Referenz ist eine Modifikation der Pearson-Korrelation, die auch nichtlineare Beziehungen erfassen soll. Sie sind also ganz anders. – ayhan

1

@ josef-pkt ‚s Antwort auf Github unten gegeben:

Es ist kein Abstand Korrelation, die eine nicht-lineare Maß für Abhängigkeit ist. z.B. meine nehmen http://jpktd.blogspot.ca/2012/06/non-linear-dependence-measures-distance.html Allerdings ist "Korrelation" in scipy.spatial.distance.correlation ein bisschen irreführend, weil nach der Formel in der Docstring ist es ein Abstand messen und keine Korrelation. perfekt korreliert mit Korrelationskoeffizient gleich 1 hat null Abstand perfekt negativ korreliert mit Korrelationskoeffizienten gleich -1 maximalen Abstand bei 2.

0

Correlational Abstand hat, ist die inverse Korrelation und sieht nur unter dem Winkel/Ähnlichkeit zwischen Mustern (so etwas wie Normalisierung). Die Korrelationsdistanz geht von 0 - 2, wobei 0 eine PERFEKTE Korrelation ist, wobei 1 keine Korrelation ist und 2 eine PERFEKTE ANTIKORRELATION ist. Ein kleiner Korrelationsdistanzwert bedeutet also nahe beieinander im Korrelationsraum (kleine Winkeldifferenz). Corr = 1 - dist; Corr dist = 1 - korr; also während eine hohe Korrelation = hohe Beziehung; LOW CORR DISTINANCE = hohe Beziehung

Verwandte Themen