出现在相同列表中的集群元素

数据挖掘 Python 聚类 相似 距离
2021-09-23 07:56:58

假设我有大量包含(无序)元素组合的集合,并且我想确定哪些元素倾向于一起出现

例如

给定以下集合:

{a,e,g}
{a,e,h}
{a,e,i}
{b,f,j}
{b,f,k}
{b,f,l}
{d,c,m}
{d,c,n}
{d,c,o}

两个元素倾向于出现在同一集合中的元素对将具有更短的距离:

# Low-distance pairs:
{a,e}, {b,f}, {d,c}

# Medium-distance pairs
{a,g}, {b,j}, {d,m}, ...

# High-distance pairs:
{g,h}, {j,n}, {b,f}, ...

目前

我正在使用自定义距离度量来实现 DBSCAN我在两个元素之间使用以下距离度量:

d(a,b) = 1 - numsets(a, b) / (numsets(a,!b) + numsets(b,!a))

其中d(a,b)表示元素之间的距离abWhilenumsets表示有多少个集合满足某些条件:

  • numsets(a, b)- 包含a和的集合的数量b
  • numsets(a,!b)- 包含a但不包含的集合数b

这个解决方案应该可以实现目标,但它不是一个很好的解决方案,我在 SE 上找不到这个问题。在解决问题方面,有没有更合理的距离度量?在实施方面,有没有更好的方法来做到这一点?

3个回答

那是一个数据挖掘问题,特别是亲和力分析

解决它的一种常用方法是Apriori 算法

请注意,您的指标可能会被零除或具有负值。它非常接近Jaccard distance,所以也许可以考虑一下。另见 http://curtis.ml.cmu.edu/w/courses/index.php/Co-occurrence_metrics

您可能还可以通过图形聚类方法取得成功,请参阅
http://www.ecography.org/blog/clustering-or-network-methods-comparing-different-methods-bioregionalisation

Levenshtein 距离(及其 cousing Jaro、Hemming 等...)

用于测量两个单词之间两个序列之间差异的 Levenshtein 距离是将一个单词(您的情况是一组字符)更改为另一个单词所需的单字符编辑(插入、删除或替换)的最小数量。

有几个实现,例如这里,它的“edit_distance”函数。