我遇到的问题是矩形内有矩形。想象一下地图,除了具有以下关键特征的特征:具有相似密度的矩形通常具有相似的尺寸和x轴上与其他矩形相似的位置,但是有时这些矩形之间的距离可能很大但通常很小。如果x轴上的位置或尺寸明显偏离,则它们不会相似。
矩形不相交,较小的矩形完全位于较大的矩形内。
矩形通常具有相似的x位置和相似的尺寸 (类似的高度和宽度),内部有较小的矩形。矩形本身将被视为它自己的集群。
有时这些群集与其他群集的距离可能相当 大(想想岛屿)。通常这些集群共享相同或 相似的尺寸和相同或相似的子矩形密度。如果是这样,尽管两个集群之间存在距离,但它们应被视为同一集群的一部分。
我附上了一张图表来更清楚地描述情况:
红色边框表示这些组是异常值,不属于任何群集 并被忽略。
蓝色边框有许多簇(黑色边框包含黑色实体) 矩形)。他们形成了一组由于相似的集群 上面提到的标准(类似的宽度,类似的X位置, 相似的密度)。即使是朝向右下角的集群 由于标准,仍被视为该群体的一部分 (类似的宽度,类似的X位置,相似的密度)。
Turquois边界有许多簇(黑色边框包含黑色) 实心矩形)。但是,这些集群的维度不同,x 位置和密度,来自蓝色边框。他们是 被认为是他们自己的一群。
到目前为止,我发现DBSCAN等密度聚类似乎是完美的,因为它考虑了噪声(异常值),并且您不需要提前知道将会有多少个聚类。
但是,您需要定义形成群集所需的最小点数和阈值距离。如果你不知道这两个会发生什么,它会因上述问题而有所不同?
另一个看似合理的解决方案是分层(凝聚)聚类(r-tree),但我担心我仍然需要知道树深度级别的截止点以确定它是否是一个聚类。
答案 0 :(得分:3)
您当然需要考虑所有限制因素。
一般来说,您的任务看起来更像是约束满意度而不是群集。
也许某些约束聚类方法对您有用,但我不确定它们是否允许您的约束。通常,它们仅支持必须链接和必须不链接的约束。
但是你当然应该尝试DBSCAN(特别是:广义DBSCAN,因为泛化可能允许你添加你拥有的约束!)和R-tree(它们实际上不是一个聚类算法,但是数据索引)。
请注意,R树将放置"异常值"进入一些叶子,以确保最小的填充。
按原样,我不能给你更详细的建议,因为即使从上面的草图,你的约束也没有明确定义恕我直言。尝试将它们放入伪代码中。你可能只有少量的矩形(比方说,100);因此,您可以负担得起运行非常昂贵的算法,例如使用自定义链接标准进行链接群集。 将您的标准纳入代码可能已经是99%的努力了!