整数列表的聚类列表

数据挖掘 scikit-学习 聚类 算法
2022-03-12 19:00:48

我有大约 100 组具有整数 ID 的样本。例如,其中 3 个可能是:

a = [0, 1, 3, 4, 6...]
b = [1, 5, 9, 102...]
c = [1, 7, 10, 42...]

我希望将这些集合聚集/分组在一起,以便在每个集群中,所有元素彼此之间至少有 X% 的公共 ID,其中 X 是输入参数。

我正在考虑使用1 - %X 作为距离度量的凝聚聚类,但不确定如何修改它以说明每个集群“信息”是其中集合之间的公共 ID 集。任何建议都将不胜感激(包括不同的技术/算法聚类正是我想到的)

2个回答

欢迎来到社区!

我会使用两组之间的互信息作为相似性的标准。在您的特殊情况下,将那些交集小于 X% 的集合的互信息设置为0. 运行你的集群,看看结果如何。使用相同的相似度矩阵,您还可以构建加权图和聚类节点(称为社区检测)。此链接从幻灯片 37 开始为您提供适当的概述,在幻灯片 48 中您可以找到自己的想法!如果您对社区检测有更多疑问,例如实施,请在此处发表评论。

所以,如果我说得对,你想要的是一个重叠矩阵 O,即:

O[i,j] = len(set(a[i]) & set(a[j]))/len(a[i]) # supposing len(a[i])==len(a[j]) and len(a[i]) == len(set(a[i])), saying all samples have same length and no repeated values

这里 a 是数据矩阵,每一行都是一个样本。

为避免重叠小于 %X 的样本对聚集在一起,您可以将这些对的重叠设置为零:

O[O < X_perc] = 0

现在,如果您使用任何适用于相异矩阵的聚类方法,您会得到一些符合您条件的聚类(“所有元素彼此之间至少有 X% 的公共 ID ”)。然而,关键问题是您的条件取决于分组本身,并且不能保证您的问题找到一个解决方案,在给定条件的情况下,所有样本都很好地聚类。 现在,为了避免对某些甚至不能保证存在的解决方案进行疯狂的递归组合搜索,我只会在 D=1-O 相异矩阵上使用一些聚类(可能是您建议的凝聚)(您的意思是 1- X% ?) 并检查树状图。我会将集群标记的阈值设置为链接中的某个值,其中合理的样本集不是单个集群的一部分(仅具有该数据点)。最后,对于每个集群,我将删除所有不满足您条件的样本,最终得到“干净”的集群。