我想将二进制矢量(数百万个)聚类成k个聚类。我正在使用汉明距离来寻找初始聚类的最近邻居(这也非常慢)。我认为K-means聚类并不适合这里。问题在于计算一些初始聚类中心的最近邻居(二进制向量)的平均值,以更新质心。
第二种选择是使用K-medoids,其中新的聚类中心是从最近的邻居之一(与特定聚类中心的所有邻居最接近的邻居)中选择的。但发现这是另一个问题,因为最近邻居的数量也很大。
有人可以指导我吗?
答案 0 :(得分:4)
可以使用具有二进制特征向量的聚类来执行k均值。我共同撰写的名为TopSig的论文有详细说明。通过获取每个维度中最频繁出现的位来计算质心。 TopSig论文将其应用于文档聚类,其中我们具有通过稀疏高维词袋特征向量的随机投影创建的二元特征向量。在http://ktree.sf.net的java中有一个实现。我们目前正在开发一个C ++版本,但它是非常早期的代码仍然很混乱,可能包含错误,但您可以在http://github.com/cmdevries/LMW-tree找到它。如果您有任何疑问,请随时通过chris@de-vries.id.au与我联系。
如果你想聚类很多二进制向量,那么还有更多可扩展的基于树的K-tree,TSVQ和EM-tree聚类算法。有关这些算法的更多详细信息,您可以查看我最近提交的用于同行评审的论文,该论文尚未发布,与EM-tree相关。
答案 1 :(得分:2)
确实k-means在这里不太合适,因为二进制数据的均值不合理。
为什么您需要完全k
个群集?这可能意味着某些向量非常适合到群集中。
您可以查看群集的一些内容:minhash,locality sensitive hashing。