整数向量的 Jaccard 系数的正确公式是什么?

数据挖掘 聚类 相似 公制 杰卡德系数
2022-02-18 18:42:23

我理解 Jaccard 指数是共同元素的数量除以不同元素的总数。但是,对于将 Jaccard 应用于“二进制向量”(即具有二进制属性(0、1)的向量或“整数向量”,即具有整数值(2、5、 6、8)。

根据向量中元素的类型,有两个公式?

这个答案评论了“二进制向量”,“它们可以被解释为值为 1 的索引集”。然而,有些例子中 Jaccard 系数是用整数向量计算的,所以它似乎是有效的。此外,scikit-learn 似乎定义了 3 种情况

二进制向量

y_true = np.array([[0, 1, 1],
                   [1, 1, 0]])
y_pred = np.array([[1, 1, 1],
                   [1, 0, 0]])

多标签案例

(什么是多标签案例在 scikit-learn 文档中没有定义)

“多类问题被二值化并像对应的多标签问题一样对待”

y_pred = [0, 2, 1, 2]
y_true = [0, 1, 2, 2]

使用公式形式的 R 库的附加测试

TP / (TP + FP + FN)

导致未定义的行为:

library("ClusterR")
pc <- c(0, 1, 2, 5, 6, 8, 9)
tc <- c(0, 2, 3, 4, 5, 7, 9)
external_validation(pc, tc, method = "jaccard_index")
[1] NaN

使用基于集合的公式是否仅适用于二元向量?

J(A,B)=|AB||AB|=|AB||A|+|B||AB|

1个回答

Jaccard 系数(或 Jaccard 相似度)在两个集合上定义 AB

J(A,B)=|AB||AB|=|AB||A|+|B||AB|

该系数有一个单一的定义,但请注意 Jaccard 是一种通用的相似性度量,它不是专门设计为评估度量。因此,假设人们想将其用作评估措施,他们需要决定(设计)如何。更准确地说,混淆可能来自以下问题:

  • 想比较哪一对?
  • 使用哪种数据结构来表示一个集合?

让我们从第二个问题开始:二进制向量是表示(编码)集合的一种常见且方便的方式。给定一组可能的元素(宇宙)U={x1,...,xn}, 任何子集sU可以表示为长度的二进制向量n在哪里ith如果布尔值为 1xis, 否则为 0。根据这种表示,Jaccard 系数是两个向量都包含 1 的索引数除以两个向量中至少一个向量包含 1 的索引数。

scikit 文档中的示例

>>> y_true = np.array([[0, 1, 1],
...                    [1, 1, 0]])
>>> y_pred = np.array([[1, 1, 1],
...                    [1, 0, 0]])
>>> jaccard_score(y_true[0], y_pred[0])
0.6666...

比较的向量是[0, 1, 1][1, 1, 1](意思是实例集{b,c}{a,b,c}),所以结果是 2/3。

多标签分类是指可以为实例分配任意数量的类。在链接的 scikit 示例中,他们将 Jaccard 系数应用于每个实例的两组类(可选地跨实例聚合结果)。这是我在上面的第一个问题中提到的设计选择的一个例子。注意:在多类问题的情况下,我什至不明白他们如何获得第三个值的这个结果,所以我无法评论它。

公式TP/(TP+FP+FN)是另一个选择什么作为集合的例子。这个公式只对二元分类任务有意义:TP 是真实实例和预测的正实例的交集,TP+FP+FN是所有正例(无论是真实的还是预测的)的并集。这就是它不适用于整数向量的原因,因为它们不能代表二进制分类的结果。

结论:必须定义他们想要比较的集合。使用整数向量最简单的方法是将它们视为整数集,在这种情况下,它们可以表示为二进制向量,如下所示:

[0, 1, 2, 5, 6, 8, 9] -> [1,1,1,0,0,1,1,0,1,1]
[0, 2, 3, 4, 5, 7, 9] -> [1,0,1,1,1,1,0,1,0,1]

但是通过二进制表示并不是必须的,只有当一个人想要使用一个以这种格式作为输入的函数时才需要它。例如,也可以使用一组作为数据结构来定义自己的函数。