我希望在具有数百万个边和节点的巨大无向图中执行图聚类。图几乎是由不同的集群聚集在一起的,这些集群仅由一些节点(可以与多个集群相关的一类模糊节点)连接在一起。 两个群集之间的边缘很少或几乎没有。这个问题与查找图的顶点剪切集几乎相似,只有一个例外是图需要分割成许多组件(它们的编号未知)。(参考图片https://docs.google.com/file/d/0B7_3zLD0XdtAd3ZwMFAwWDZuU00/edit?pli=1)
它几乎就像不同的强连接组件共享它们之间的几个节点而我应该删除那些节点来分离那些强连接的组件。边缘被称重,但这个问题更像是在图中找到结构,因此边缘权重不会相关。 (另一种思考问题的方法是可视化Solid Spheres在某些点上相互接触,其中Spheres是那些强连接的组件,触摸点是那些模糊的节点)
我正在制作一些原型,所以我很安静,我自己选择图形聚类算法并选择最好的。另外,我需要一个能够切割节点而不是边缘的解决方案,因为在我的情况下,不同的群集共享节点而不是边缘。
是否有任何研究论文,博客解决这个问题或有些相关的问题?或者任何人都可以提出解决这个问题的方法,无论多么脏。
由于涉及数百万个节点和边缘,我需要一个 MapReduce 解决方案的实现。任何输入,链接也是如此?
MapReduce中是否有可以直接使用的当前开源实现?
我认为此问题类似于通过删除顶点在线社交网络中查找社区。 strong>
答案 0 :(得分:1)
你的问题并非如此简单。我担心它与集群问题有关,这是NP完全的,所以除非你以某种方式量化“集群之间几乎没有边缘”的陈述,否则你的问题可能仍然非常困难。但是,我要做的就是尝试一种肮脏,贪婪的方法,即将节点视为以下类型的准神经网络:
我认为每个顶点都有输入,输出和一个sigmoid激活函数,它将输入值(输入之和)转换为输出值。输出值,我认为这很重要,不会被克隆并发送给所有邻居,而是在邻居之间平均分配。除此之外,我将定义神经元中活动的对数衰减(自我抑制,与自身的抑制性连接),由网络的衰减参数全局定义。
现在,我将开始模拟从活动0.5开始的所有神经元(活动范围是0到1),具有非常高的衰减参数,这将导致所有神经元快速稳定在0状态。然后我逐渐减少衰减参数,直到稳态结果产生第一个具有非零稳定活动的团。
问题是下一步该怎么做。一种可能性是从图中减去找到的团,并再次运行相同的过程,直到我们找到所有的团。如果您的图表确实表现得很好(实际上几乎是聚集的),这种贪婪的方法可能会成功,但可能会导致意外的结果。另一种可能性是给发现的集团带来一种独特的集团气味,这种气味会对其他集团产生排斥(相互抑制),重新运行算法直到第二集团被发现,给它一个不同的集团气味排斥所有其他集团等,直到每个节点有自己的气味。
我认为这与我对此有很多重要的想法。
关键是,由于在一般情况下可能无法解决此问题(可能是NP完成),因此您需要使用图表具有的任何特殊属性。这意味着您需要使用参数一段时间,直到算法解决了您遇到的99%的情况。如果不对您遇到的实际数据集进行长时间的实验,我认为不可能在数字上给出数字上精确的答案。
答案 1 :(得分:0)
由于涉及数百万个节点和边缘,我需要解决方案的MapReduce实现。任何输入,链接也是如此?
根据我的经验,我怀疑在这里使用Map / Reduce是否真的有利。前10 ^ 6个节点的顺序并不是那么大[在非超连接图中也是如此,因为你正在考虑聚类],以及使用Map / Reduce的空头[除非你已经设置了你的硬件/软件因为它对你的问题不值得。
Map / Reduce将更好地工作,一旦解决了群集问题,然后想要使用类似的分析处理每个群集。基本上,当您可以将任务分解为相对孤立的子任务时,可以并行执行。这当然可以级联到几层。
在一个相对类似的情况下,我个人首先将我的图形建模为图形数据库(我使用Neo4J,并且会高度推荐它),然后运行我的分析和查询。你会对这个解决方案的白板友好程度感到惊讶,即使是大规模连接和连接的查询也会在瞬间执行,特别是在几百万个节点的规模上。例如,您可以根据分离度进行过滤分析,然后列出公地。