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], 第 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

返回:
jaccard浮点数

向量 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. 和 Rousseeuw, P. J. (1990)。 “数据中的分组:聚类分析导论。” John Wiley & Sons, Inc.

[2] (1,2)

Kosub, S. (2019)。 “关于 Jaccard 距离的三角不等式的说明。” 模式识别快报,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)