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 von1.0gibt.
- 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,
nanzurückgeben. Dies wurde geändert, um stattdessen0zurü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.
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)