scipy.spatial.distance.

jaccard#

scipy.spatial.distance.jaccard(u, v, w=None)[Quelle]#

Berechnet die Jaccard-Dissemiliarität zwischen zwei booleschen Vektoren.

Gegeben seien boolesche Vektoren \(u \equiv (u_1, \cdots, u_n)\) und \(v \equiv (v_1, \cdots, v_n)\), die nicht beide Null sind. Ihre Jaccard-Dissemiliarität ist definiert als ([1], S. 26)

\[d_\textrm{jaccard}(u, v) := \frac{c_{10} + c_{01}} {c_{11} + c_{10} + c_{01}}\]

wo

\[c_{ij} := \sum_{1 \le k \le n, u_k=i, v_k=j} 1\]

für \(i, j \in \{ 0, 1\}\). Wenn \(u\) und \(v\) beide Null sind, ist ihre Jaccard-Dissemiliarität per Definition Null. [2]

Wenn ein (nicht-negativer) Gewichtsvektor \(w \equiv (w_1, \cdots, w_n)\) bereitgestellt wird, ist die gewichtete Jaccard-Dissemiliarität ähnlich definiert, jedoch mit \(c_{ij}\) ersetzt durch

\[\tilde{c}_{ij} := \sum_{1 \le k \le n, u_k=i, v_k=j} w_k\]
Parameter:
u(N,) array_like of bools

Eingangsvektor.

v(N,) array_like of bools

Eingangsvektor.

w(N,) array_like of floats, optional

Gewichte für jedes Paar von \((u_k, v_k)\). Standardwert ist None, was jedem Paar ein Gewicht von 1.0 gibt.

Rückgabe:
jaccardfloat

Die Jaccard-Dissemiliarität zwischen den Vektoren u und v, optional gewichtet mit w, falls angegeben.

Hinweise

Die Jaccard-Dissemiliarität erfüllt die Dreiecksungleichung und ist als Metrik qualifiziert. [2]

Der Jaccard-Index oder Jaccard-Ähnlichkeitskoeffizient ist gleich eins minus der Jaccard-Dissemiliarität. [3]

Die Dissemiliarität zwischen allgemeinen (endlichen) Mengen kann durch Kodierung als boolesche Vektoren und Berechnung der Dissemiliarität zwischen den kodierten Vektoren berechnet werden. Zum Beispiel können Teilmengen \(A,B\) von \(\{ 1, 2, ..., n \}\) in boolesche Vektoren \(u, v\) kodiert werden, indem man \(u_k := 1_{k \in A}\) und \(v_k := 1_{k \in B}\) für \(k = 1,2,\cdots,n\) setzt.

Geändert in Version 1.2.0: Zuvor würde die Funktion bei allen (positiv gewichteten) Elementen in u und v, die Null sind, nan zurückgeben. Dies wurde geändert, um stattdessen 0 zurückzugeben.

Geändert in Version 1.15.0: Numerische Eingaben, die nicht 0/1 waren, führten früher zu einem Ad-hoc-Ergebnis. Seit Version 1.15.0 werden numerische Eingaben vor der Berechnung in boolesche Werte umgewandelt.

Referenzen

[1]

Kaufman, L. und Rousseeuw, P. J. (1990). “Finding Groups in Data: An Introduction to Cluster Analysis.” John Wiley & Sons, Inc.

[2] (1,2)

Kosub, S. (2019). „A note on the triangle inequality for the Jaccard distance.“ Pattern Recognition Letters, 120:36-38.

Beispiele

>>> from scipy.spatial import distance

Nicht-Null-Vektoren ohne übereinstimmende Einsen haben eine Dissemiliarität von 1,0

>>> distance.jaccard([1, 0, 0], [0, 1, 0])
1.0

Vektoren mit einigen übereinstimmenden Einsen haben eine Dissemiliarität kleiner als 1,0

>>> distance.jaccard([1, 0, 0, 0], [1, 1, 1, 0])
0.6666666666666666

Identische Vektoren, einschließlich Nullvektoren, haben eine Dissemiliarität von 0,0

>>> distance.jaccard([1, 0, 0], [1, 0, 0])
0.0
>>> distance.jaccard([0, 0, 0], [0, 0, 0])
0.0

Das folgende Beispiel berechnet die Dissemiliarität direkt aus einer Konfusionsmatrix, indem der Gewichtsvektor auf die Häufigkeit von True Positive, False Negative, False Positive und True Negative gesetzt wird

>>> distance.jaccard([1, 1, 0, 0], [1, 0, 1, 0], [31, 41, 59, 26])
0.7633587786259542  # (41+59)/(31+41+59)