我有一些大的图像数据集(每个数百万),我想根据图像的视觉相似性对它们进行聚类。我为每张图像提取了一个特征向量;特征表示空间是我想在实践中聚类的空间。但是,由于以下限制,我遇到了一些困难:
- 我无法提前知道集群的数量;
- 聚类算法必须是稳定的(它不能依赖于顺序);
- 我不想受到链接效应的影响(即拉长的簇,其中非常不同的图像可以通过一系列小的变换 - 变形链接);
- 我希望该解决方案具有可扩展性(例如,通过使用 Apache Spark),或者更好的是增量式(在线)和高效的。我想最后一点可以通过流聚类算法来解决
鉴于所有这些限制,我正在努力解决这个问题。Spark MLlib 中的所有现成算法都需要预先确定集群的数量。单链接或 DBSCAN 算法受到链接效应的影响(参见基于密度的算法中的“密度可达性”定义)。
如果我有一个近似的可扩展解决方案,我想我会很满意。如果解决方案有效,我可以放弃上述一些限制。对我来说,可扩展集群似乎是一个热门研究课题(我还没有找到现成的解决方案)。
当然,我不是要求完美的答案,但如果你们中的一些人以前遇到过类似的挑战,我想收到一些建议。我尝试了一些层次聚类技术,除了单链接(例如Ward 方法),但所需的时间/空间复杂度(O(N^2))对于我的数据集来说太昂贵了;此外,如何并行化它们并不直观。
Local Sensitive Hashing似乎具有一些有趣的特性,但是,它似乎更适合 kNN 搜索而不是聚类。
我读了这篇论文:A Scalable Hierarchical Clustering Algorithm Using Spark,但不幸的是,它使用了 Single Linkage,因此陷入了我想避免的链接效应。
此外,这篇文章:Detecting image similarity using Spark, LSH, and TensorFlow似乎很有趣,但它并没有提供太多关于实际聚类细节的见解。