【问题标题】:Python package function for Jaccard Similarity between sets?用于集合之间的 Jaccard 相似性的 Python 包函数?
【发布时间】:2018-06-27 16:20:30
【问题描述】:

可以使用 scikit-learn(或其他著名的 python 包)来获取一对 集合之间的 Jaccard 相似度吗?

我只看到 sklearn jaccard_similarity_score function 处理相等长度的向量/数组/张量,而我确实需要 intersection-over-union 计算,这是一个集合计算,而不是两个相同大小的张量的计算。

也许我应该使用the multi-label-binarizer, exemplified here,如果这是 scikit api 提供的预期方式。

当然,不用包就可以自己实现几行代码...

*这个问题不是家庭作业,是我为非技术观众制作的幻灯片,它说明了这里的重点。

只是想知道。

【问题讨论】:

  • 输入是什么类型的集合?它们是哪个原生 Python 或 scipy/numpy 对象?请向我们展示一个带有可重现数据的小代码(随机即可)。
  • python 中的集合怎么样? len(intsersect) / len(union)

标签: python scikit-learn statistics set multilabel-classification


【解决方案1】:

Numpy 内置了一些Set Routines。在这种情况下,正如@Harpal 指出的那样,您可以使用相交和联合操作。

在纯python中使用intersectionunion

gold = ['A', 'B', 'C']
clf = ['A', 'D']
gold_s = set(gold)
clf_s = set(clf)
jac_sim = len(gold_s.intersection(clf_s)) / len(gold_s.union(clf_s))
jac_sim
0.25

在 NumPy 中使用 intersect1dunion1d

gold = np.array(gold)
clf = np.array(clf)
jac_sim = np.intersect1d(gold, clf).size / np.union1d(gold, clf).size
jac_sim
0.25

当然 NumPy 实现要慢一些,但如果您的数据已经在 NumPy 数组中,它可能比将其转换为集合并在 Python 中进行计算要快。这完全取决于数据的大小。

【讨论】:

  • 这个答案太棒了。我只是想知道 NumPy 是否真的没有对 Jaccard 相似性和其他简单度量的内置支持。我想只适用于向量,在 NumPy 中添加如此简单的东西并不是那么有趣。
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 2022-07-21
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2011-10-05
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多