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浮点数
向量 u 和 v 之间的 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 中更改:以前,如果 u 和 v 中的所有(正权重)元素都为零,则该函数将返回
nan
。 现在改为返回0
。在版本 1.15.0 中更改:非 0/1 数字输入过去会产生特定的结果。 从 1.15.0 开始,数字输入会在计算前转换为布尔值。
参考文献
[1]Kaufman, L. 和 Rousseeuw, P. J. (1990)。 “数据中的分组:聚类分析导论。” John Wiley & Sons, Inc.
示例
>>> 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)