我应该使用什么算法将一个巨大的二进制数据集聚类成几个类别?

机器算法验证 聚类 数据集 k-均值 二进制数据
2022-03-12 05:03:51

我有一个大的(650K 行 * 62 列)二进制数据矩阵(仅 0-1 个条目)。矩阵大多是稀疏的:大约 8% 被填充。

我想将它分成 5 个组 - 比如说从 1 到 5 命名。我尝试了层次聚类,但它无法处理大小。考虑到长度为 62 的 650K 位向量,我还使用了基于汉明距离的 k 均值聚类算法。我没有得到正确的结果。

请帮忙。

4个回答

你问错问题了。

与其问“什么算法”,不如问“你的应用程序中什么是有意义的类别/集群”。

我对上述算法不起作用并不感到惊讶——它们是为非常不同的用例而设计的。k-means 不适用于任意其他距离。不要将其与汉明距离一起使用。将其称为 k- means是有原因的,它仅在算术平均值有意义时才 有意义(不适用于二进制数据)。

您可能想尝试使用 k-modes,IIRC 这是一个实际上用于分类数据的变体,而二进制数据在某种程度上是分类数据(但稀疏性可能仍然会杀死您)。

但首先,您是否删除了重复项以简化数据,并删除了唯一/空列?

也许 APRIORI 或类似方法对您的问题也更有意义。

无论哪种方式,首先弄清楚你需要什么,然后哪种算法可以解决这个挑战。工作数据驱动,而不是通过尝试随机算法。

二进制数据聚类的经典算法是伯努利混合模型。该模型可以使用贝叶斯方法进行拟合,也可以使用 EM(期望最大化)进行拟合。你可以在整个 GitHub 上找到示例 python 代码,而前者更强大但也更难。我在 GitHub 上有一个模型的 C# 实现(使用具有限制性许可证的 Infer.NET!)。

该模型相当简单。首先对数据点所属的簇进行采样。然后从数据集中的维度独立地从尽可能多的伯努利采样。请注意,这意味着给定集群的二进制值的条件独立!

在贝叶斯设置中,集群分配的先验是狄利克雷分布。如果您认为某些集群比其他集群大,这是放置先验的地方。对于每个集群,您必须先为每个伯努利分布指定一个 Beta 分布。通常,此先验是 Beta(1,1) 或统一的。最后,不要忘记在给定数据时随机初始化集群分配。这会破坏对称性,采样器不会卡住。

BMM 模型在贝叶斯设置中有几个很酷的特性:

  1. 在线集群(数据可以作为流到达)

  2. 模型可用于推断缺失的尺寸

当数据集非常大并且不适合机器的 RAM 时,第一个非常方便。第二个可用于各种缺失数据的插补任务,例如。估算二进制 MNIST 图像的缺失一半。

也许我的答案有点晚了,但将来可能对某些人有用。

自适应共振理论是解决二元分类问题的好算法。检查 ART 1。更多信息可以在第 19 章的免费神经网络设计书籍中看到。

这个网络结合了伟大的生物学思想和良好的数学实现。此外,该算法易于实现,并且在本书中,您还可以找到有关如何构建此分类器的分步说明。

你问的是正确的问题。你可以使用kmeans!!!尽管某些人可能会告诉您什么,但您绝对可以使用 kmeans 进行聚类。二进制数据不会导致 kmeans 失败。但是,您可能需要考虑以下事项:

1 - 按列对矩阵进行零均值。这意味着您计算平均行向量,该向量现在变为实值向量,然后从每个原始二进制向量中减去该向量。您的 650K 行向量的 0/1 二进制矩阵现在变成了 650K 向量的实值矩阵。请注意,这不会改变向量之间的相互距离(或相似性)。它只是一个平移操作,同样适用于每个向量。

2 - 将符号函数应用于矩阵。如果每个矩阵元素为负,sign 函数强制每个矩阵元素为 -1,否则为 +1。在第 1 步和第 2 步中,这种变换的结果是新矩阵不再是稀疏的。

3 - 现在应用 kmeans。您可以使用欧几里得度量,或尝试使用您的 kmeans 实现支持的其他度量。无需使用特定的二元聚类算法。kmeans 很简单,在一个像样的桌面上集群 650K 向量应该很容易实现。

4 - 如果您希望得到二元簇向量作为结果,则将符号函数应用于最后的 k 个簇。您还可以将最终的簇向量从 +1/-1 表示转换为 0/1 表示(但仅在应用符号函数之后)。

注意事项:

因为您只有 62 维向量,所以二进制表示中的向量之间可能的“相似性”值的范围是 62(对应于 0 到 62 之间的汉明距离。)由于二进制向量之间的距离范围因此受到限制,因此任何汉明距离排名必然会导致许多关系。当您尝试将 650K 向量压缩到仅 62 个可能的距离存储桶中时,每个存储桶的向量数量将取决于集群的数量,但通常会很大,您可能需要通过返回原始数据来解决关系导出初始二进制矩阵。