scipy.spatial.distance.

jaccard#

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

計算兩個布林向量之間的 Jaccard 相異度。

給定布林向量 \(u \equiv (u_1, \cdots, u_n)\)\(v \equiv (v_1, \cdots, v_n)\),且兩者不全為零,它們的Jaccard 相異度定義為 ([1], p. 26)

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

其中

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

對於 \(i, j \in \{ 0, 1\}\)。如果 \(u\)\(v\) 均為零,則它們的 Jaccard 相異度定義為零。[2]

如果提供(非負)權重向量 \(w \equiv (w_1, \cdots, w_n)\),則加權 Jaccard 相異度的定義類似,但 \(c_{ij}\) 被替換為

\[\tilde{c}_{ij} := \sum_{1 \le k \le n, u_k=i, v_k=j} w_k\]
參數:
u(N,) 類陣列布林值

輸入向量。

v(N,) 類陣列布林值

輸入向量。

w(N,) 類陣列浮點數,選用

每個 \((u_k, v_k)\) 配對的權重。預設值為 None,這會給予每個配對 1.0 的權重。

回傳值:
jaccardfloat

向量 uv 之間的 Jaccard 相異度,如果提供 w,則可選擇性地加權。

註解

Jaccard 相異度滿足三角不等式,並符合度量標準。[2]

Jaccard 指數,或Jaccard 相似係數,等於 1 減去 Jaccard 相異度。[3]

一般(有限)集合之間的相異度可以透過將它們編碼為布林向量並計算編碼向量之間的相異度來計算。例如,\(\{ 1, 2, ..., n \}\) 的子集 \(A,B\) 可以透過設定 \(u_k := 1_{k \in A}\)\(v_k := 1_{k \in B}\) 對於 \(k = 1,2,\cdots,n\) 編碼為布林向量 \(u, v\)

在 1.2.0 版本中變更:先前,如果 uv 中所有(正權重)元素均為零,則函數會回傳 nan。這已變更為改為回傳 0

在 1.15.0 版本中變更:非 0/1 數字輸入過去會產生特設結果。自 1.15.0 起,數字輸入在計算前會轉換為布林值。

參考文獻

[1]

Kaufman, L. and 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.

範例

>>> from scipy.spatial import distance

沒有匹配 1 的非零向量的相異度為 1.0

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

具有一些匹配 1 的向量的相異度小於 1.0

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

相同的向量,包括零向量,相異度為 0.0

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

以下範例直接從混淆矩陣計算相異度,方法是將權重向量設定為真陽性、偽陰性、偽陽性和真陰性的頻率

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