我有一个很大的(650K行* 62列)二进制数据矩阵(仅0-1个条目)。矩阵大部分是稀疏的:大约占8%。
我想将其分为5组-从1到5命名。我尝试了层次化群集,但是它无法处理大小。考虑到长度为62的650K位向量,我还使用了基于汉明距离的k-means聚类算法。在这些情况下,我都没有得到正确的结果。
请帮忙。
我有一个很大的(650K行* 62列)二进制数据矩阵(仅0-1个条目)。矩阵大部分是稀疏的:大约占8%。
我想将其分为5组-从1到5命名。我尝试了层次化群集,但是它无法处理大小。考虑到长度为62的650K位向量,我还使用了基于汉明距离的k-means聚类算法。在这些情况下,我都没有得到正确的结果。
请帮忙。
Answers:
您在问错问题。
而不是询问“什么算法”,您应该询问“什么是应用程序中有意义的类别/集群”。
我对上述算法不起作用并不感到惊讶-它们是针对非常不同的用例设计的。K-手段确实没有与其他任意距离的工作。请勿在汉明距离上使用它。之所以将其称为k- means是有原因的,仅当算术平均值有意义时才使用 它(不适用于二进制数据)。
您可能想尝试使用k模式,IIRC是一个变体,实际上是要与类别数据一起使用的,而二进制数据则是某种类别的(但是稀疏性可能仍然会使您丧命)。
但是首先,是否已删除重复项以简化数据,并删除了唯一/空列?
也许APRIORI或类似方法对您的问题也更有意义。
无论哪种方式,首先要弄清楚您需要什么,然后哪种算法可以解决此难题。工作数据驱动,而不是尝试随机算法。
二进制数据聚类的经典算法是Bernoulli Mixture模型。可以使用贝叶斯方法拟合模型,也可以使用EM(期望最大化)拟合模型。您可以在整个GitHub上找到示例python代码,而前者功能更强大,但难度也更大。我在GitHub上有该模型的C#实现(使用具有限制性许可证的Infer.NET!)。
该模型非常简单。首先对数据点所属的集群进行采样。然后根据数据集中的维数独立地从尽可能多的伯努利抽样。请注意,这意味着在给定簇的情况下二进制值的条件独立性!
在贝叶斯设置中,优先于群集的分配是Dirichlet分布。如果您认为某些群集大于其他群集,则可以在此处放置优先级。对于每个集群,您必须为每个Bernoulli分配指定一个先验的Beta分布。通常,此先验值是Beta(1,1)或统一值。最后,别忘了在给定数据后随机初始化集群分配。这将破坏对称性,并且采样器不会卡住。
在贝叶斯环境中,BMM模型具有几个很酷的功能:
在线群集(数据可以作为流到达)
模型可用于推断缺少的尺寸
当数据集很大并且不适合计算机的RAM时,第一个非常方便。第二个可以用于各种丢失的数据插补任务,例如。估算缺少的MNIST二进制图像的一半。