【问题标题】:Fast way of doing k means clustering on binary vectors in c++做k的快速方法意味着在c ++中对二进制向量进行聚类
【发布时间】:2013-06-06 15:49:34
【问题描述】:

我想将二进制向量(数百万个)聚集成 k 个簇。我正在使用汉明距离来寻找与初始簇最近的邻居(这也很慢)。我认为 K-means 聚类并不适合这里。问题在于计算一些初始聚类中心的最近邻居(二进制向量)的平均值,以更新质心。

第二种选择是使用 K-medoids,其中新的聚类中心是从最近的邻居之一(与特定聚类中心的所有邻居最近的一个)中选择的。但发现这是另一个问题,因为最近邻居的数量也很大。

有人可以指导我吗?

【问题讨论】:

    标签: vector binary cluster-analysis hamming-distance


    【解决方案1】:

    可以使用二进制特征向量进行聚类来进行 k-means。我合着的名为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 相关的论文。

    【讨论】:

    • 究竟如何使用 LWM-tree 来聚类 ORB 描述符?
    【解决方案2】:

    确实,k-means 在这里不太合适,因为这种方法在二进制数据上是不合理的。

    为什么您需要 k 集群?这可能意味着某些向量不能很好地适应它们的集群。

    您可以研究一些用于集群的东西:minhash、局部敏感散列。

    【讨论】:

    • 是的,我需要 K 个集群,因为它们将用作我的数据点的词汇表(码本)。我会将它们用于 Bag of Word 模型。
    • 好吧,例如,您可以使用任意数量的集群,并忽略未分配的点。如果聚类算法说 317 个聚类是合适的,1000 个点是噪声,为什么不使用 317 个词呢?
    • 我对 LSH 的理解是它可以用来寻找一些初始聚类中心的最近邻居。我仍然很困惑如何为下一次聚类过程迭代选择下一个聚类中心。
    • 或者我们真的需要运行下一次迭代吗?你能详细说明一下吗?
    • 您可以使用 LSH 来加速基于邻域的聚类算法。可能不是 k-means,而是任何更现代的算法。
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2015-09-18
    • 2017-08-28
    • 2020-04-20
    • 2018-01-22
    • 2018-01-30
    相关资源
    最近更新 更多