这听起来像是一个小问题,但是我在网上找不到任何东西。
我们有一组元素a b c d e
。对于那些元素,定义了成对的距离。每个元素都需要处理。为了处理元素-需要N个最近的邻居。
问题:如何将这些元素分解为大小大致相等的M
组,然后扩展这些组,以使该组内的每个元素在扩展组中将有N
个最近的邻居。这可用于并行处理原始元素。
我正在使用Spark-但这可能可以抽象为任何并行计算。
这是一个例子:
We have following elements, the distance between them is just their difference.
N = 4 # number of nearest neighbours required for the computation
M = 2 # desired number of clusters
elements:
1 2 3 4 5 6
basic clusters:
1 2 3
4 5 6
extended clusters:
1 2 3 (4 5)
4 5 6 (2 3)
这怎么称呼,是否有一些通用的方法来解决这种问题?我的理解是,这并不是严格意义上的clustering
。
此算法(集群+扩展)将在单个节点上运行,然后将合并大量数据并在分布式系统中进行处理。
答案 0 :(得分:1)
第一步,可以测试一个简单的贪婪算法。
我觉得确定重叠(扩展)集,然后确定非扩展集更合乎逻辑。
让我们选择K(= M?)点与所有其他点尽可能远。
我假设在这里选择这样的极值点是可行的,在您的示例中为1
和6
。
请注意,初始点数可能少于M。
一个变种是继续执行该过程,直到每个集合都具有所需数量的满意点为止。
每个随机过程可能提供不同的解决方案。可以在不同的节点上并行执行几次尝试。
在您的简单示例中,该过程立即提供了解决方案:
两个不同的集合可能具有相同的满意点。即使此点必须保留在每个超出的集合中,也可以将其从一个非扩展集合中删除
该算法的一个理由:我认为极端点必须位于不同的非扩展集中。这意味着它们的邻居必须出现在对应的扩展集Si中。