scipy.spatial.distance.

jaccard#

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

计算两个布尔向量之间的 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,) array_like of bools

输入向量。

v(N,) array_like of bools

输入向量。

w(N,) array_like of floats, optional

每个 \((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}\) for \(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)