【问题标题】:Non mahout java - implementation of Canopy clustering非 mahout java - Canopy 集群的实现
【发布时间】:2013-01-02 02:13:10
【问题描述】:

我有自己的基于 java 的集群实现 (knn)。但是我面临可扩展性问题。我不打算使用 Mahout,因为我的要求非常简单,而且 mahout 需要大量工作。我正在寻找基于 java 的 Canopy 集群实现,我可以将其插入我的算法并进行并行处理。

基于 Mahout 的 Canopy 库与向量和索引相结合,不适用于纯字符串。如果您知道我可以使用简单库在字符串上使用树冠聚类的方式,它将解决我的问题。

我的要求是将字符串列表(比如 10K)传递给 Canopy 聚类算法,它应该返回基于 T1 和 T2 的子列表。

【问题讨论】:

    标签: machine-learning cluster-analysis


    【解决方案1】:

    冠层聚类主要用作并行化的预处理步骤。我不确定它会让你在一个节点上获得多少。我认为您不妨立即计算实际算法,或者构建一个索引,例如 M-tree。

    Canopy 集群的优势在于您可以独立在多个节点上运行它,然后将它们的结果重叠。

    还要检查它是否确实与您的方法兼容。我认为树冠可能需要 metric 属性才能正确。你的字符串距离是一个合适的度量(即三角不等式)吗?

    【讨论】:

    • 顺便说一下,度量属性也必须适用于常规 k-means
    • 这是不正确的,k-means 不假设三角不等式。它假设 mean 正在最小化方差,这可能不适用于其他距离; k-means 是为欧几里得距离写的。
    • 我的错误:我的意思是,我对 k-means 的度量和树冠的度量有同样的担忧,因为我相信树冠聚类只是通过执行聚类来近似 k-means在原始问题的子空间上并合并它们。您能否通过说“均值最小化方差”来详细说明您的意思?集群?手段是最小化...什么的方差?
    【解决方案2】:

    10,000 个数据点,如果您只关心这些,那么标准 k-means 应该没有问题。在考虑树冠聚类(实际上是为数百万甚至数十亿的示例而设计的)之前,我会先考虑优化它。您可能错过了一些事情:

    • 预先计算每个字符串的特征向量。不要每次想要将 s_1 与 s_2 或 s_1 与集群质心进行比较时都这样做
    • 您只需将汇总统计信息保存在内存中:分配给一个簇的所有点的总和和分配给一个簇的点数。完成迭代后,将总和除以 ns,就得到了新的质心。
    • 您的特征空间的维度是多少?请注意,您应该使用距离度量,其中两个向量都为零的维度没有影响,因此您只需要计算非零维度。将您的点存储为稀疏向量以促进这一点。

    您能否进行一些分析并确定您的实施中的瓶颈在哪里?我对您关于 Mahout 无法使用纯字符串的评论感到有些困惑。

    【讨论】:

    • 10,000 只是一个例子。我有 2 GB 字符串的数据集,只有一列。
    • 我对特征向量不太清楚,因为我只有简单的字符串,比如“机场停车”和“机场停车系统”。我相信 Mahout 向量是一种特征向量。但我不确定字符串是如何转换成数字的(如果我打开 mahout 矢量文件,它是从 lucene 索引文件派生的数字)
    • 我没有预定数量的集群,我想制作。我正在做的是读取所有字符串并使用code.google.com/p/simile-vicino/source/browse/trunk/src/edu/mit/… 类对其进行聚类。但是,它在 3-4 百万条记录后内存不足。
    • 无论如何,该代码似乎正在将您的字符串转换为一袋单词/一袋 n-gram。此外,该实现使用集合来存储集群和数据点,虽然这是良好的编程实践,但不会提高内存效率。看看mallet.cs.umass.edu,这是一个非常高效的java机器学习包,它实现了各种集群方法。
    • 谢谢 Ben,让我看看槌子
    【解决方案3】:

    您应该尝试ELKI 中的聚类算法。很抱歉如此无耻地宣传我密切相关的项目。但它是以可比方式实现的最大的聚类和异常值检测算法集合。 (如果您采用 some R 包中提供的所有聚类算法,您最终可能会得到更多算法,但由于实现差异,它们不会真正具有可比性)

    基准测试显示同一算法的不同实现在速度上存在巨大差异。请参阅我们的 benchmarking 网站,了解即使在 k-means 等简单算法上,性能也会有多大差异。

    我们确实还没有 Canopy Clustering。原因是它更像是一个预处理索引,而不是一个聚类算法。有点像 M-tree 或 DBSCAN 聚类的原始变体。但是,我们希望看到贡献的树冠聚类作为这样的预处理步骤。

    到目前为止,ELKI 处理字符串的能力也受到了一些限制。您可以很好地加载典型的 TF-IDF 向量,我们对稀疏向量类和相似函数进行了一些优化。不过,他们还没有完全利用 k-means 的稀疏性,而且也没有球形 k-means。但是,为什么不能期望稀疏向量上的 k-means 结果非常有意义,原因有很多;它更像是一种启发式方法。

    但是,如果您可以尝试解决您的问题并报告您的经验,那将会很有趣。与您的实施相比,性能是否具有竞争力?我们很乐意看到用于文本处理的贡献模块,例如进一步优化的相似函数,或球形 k-means 变体。

    更新: ELKI 现在实际上包括 CanopyClusteringCanopyPreClustering(届时将成为 0.6.0 的一部分)。但截至目前,它只是另一种聚类算法,尚未用于加速其他算法,例如 k-means。我需要检查如何最好地将它用作某种索引来加速算法。如果您设置 T1=epsilon 和 T2=0.5*T1,我可以想象它也有助于加快 DBSCAN。 CanopyClustering 恕我直言的最大问题是如何选择一个好的半径。

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2014-07-12
      • 2023-03-03
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2013-06-01
      • 2014-10-15
      相关资源
      最近更新 更多