【问题标题】:Clustering elements based on highest similarity基于最高相似度的元素聚类
【发布时间】:2016-04-18 06:10:18
【问题描述】:

我正在使用由一组可重用层组成的 Docker 映像。现在给定一组图像,我想组合具有大量共享层的图像。

更准确地说:给定 N 个图像的集合,我想创建一个集群,其中一个集群中的所有图像彼此共享超过 X% 的服务。每张图片只能属于一个集群。

我自己的研究指向集群算法的方向,我使用相似性度量来决定哪些图像一起属于一个集群。我知道如何编写相似度度量。但是,我很难找到一个准确的算法或伪算法来开始。

有人可以推荐一种算法来解决这个问题或提供伪代码吗?

编辑:经过更多搜索后,我相信我正在寻找类似这种层次聚类 (https://github.com/lbehnke/hierarchical-clustering-java) 但具有阈值 X 的东西,这样相似度低于 X% 的邻居不会合并并留在单独的集群。

【问题讨论】:

  • 我最终通过使用层次聚类解决了这个问题,然后从上到下遍历树状图的每个分支,直到找到距离低于阈值的聚类。最坏的情况是没有这样的集群,但我最终会出现在树状图的叶子中,这意味着该元素在它自己的集群中。

标签: algorithm docker cluster-analysis similarity


【解决方案1】:

我最终通过使用层次聚类解决了这个问题,然后从上到下遍历树状图的每个分支,直到找到距离低于阈值的聚类。最坏的情况是没有这样的集群,但我最终会出现在树状图的一个叶子中,这意味着该元素在它自己的集群中。

【讨论】:

    【解决方案2】:

    我相信您是一名开发人员并且您没有数据科学方面的经验?

    有许多聚类算法,它们各有优缺点(请咨询https://en.wikipedia.org/wiki/Cluster_analysis),但我认为解决您的问题比想象的要容易。

    我假设 N 足够小,因此您可以在 RAM 内存中存储具有 N^2 个浮点值的矩阵?如果是这种情况,你的处境就很舒服了。您写道,您知道如何实现相似性度量,因此只需计算所有 N^2 对的度量并将其存储在矩阵中(它是对称矩阵,因此只能存储一半)。请确保您的相似性度量为一对图像分配特殊值,其中相似性度量小于某个 X%,例如 0 或无穷大(这取决于您将函数视为相似性度量还是距离)。我认为完美的解决方案是为相似度大于 X% 阈值的对分配 1,否则为 0。

    之后,treat 就像一个图表。获取第一个顶点并进行例如深度优先搜索或任何其他图形行走例程。这是您的第一个集群。之后获取第一个未访问的顶点并重复图形行走。当然,您可以将图形存储为邻接列表以节省内存。

    这个算法假设你真的不关心有多少图像相似以及哪些图像对比其他图像更相似,但它们是否足够相似(相似度度量大于给定阈值)。

    不幸的是,在聚类分析中,必须计算 100% 的可能配对是很常见的。使用一些花哨的数据结构来进行 k-最近邻搜索,可以节省一定数量的距离调用,但您必须确保您的相似性度量满足三角不等式。

    如果您对此答案不满意,请详细说明您的问题并阅读:

    K-means(主要缺点:你必须指定簇的数量)

    分层聚类(计算时间慢,顶部所有图像都在一个聚类中,您必须在适当距离处切割树状图)

    光谱聚类(用于图,但我认为对于这个简单的问题来说它太复杂了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 2020-07-12
      • 2021-11-28
      • 2021-03-08
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多