Graph 通过移除节点(顶点)对几乎聚集的图进行图聚类

Graph 通过移除节点(顶点)对几乎聚集的图进行图聚类,graph,mapreduce,social-networking,cluster-analysis,graph-algorithm,Graph,Mapreduce,Social Networking,Cluster Analysis,Graph Algorithm,我想在一个巨大的无向图中执行图聚类,该图具有数百万条边和节点。图几乎是由一些节点(可以与多个集群相关的模糊节点)连接在一起的不同集群组成的集群两个簇之间将很少或几乎没有边。这个问题几乎类似于寻找一个图的顶点割集,但有一个例外,即图需要划分为许多组件(它们的数量未知)。(请参阅此图) 这几乎就像不同的强连接组件在它们之间共享一对节点,我应该删除这些节点以分离这些强连接组件。边是经过加强的,但这个问题更像是在图中查找结构,所以边的加强并不相关。(思考这个问题的另一种方法是将实心球体在某些点上相互接触

我想在一个巨大的无向图中执行图聚类,该图具有数百万条边和节点。图几乎是由一些节点(可以与多个集群相关的模糊节点)连接在一起的不同集群组成的集群两个簇之间将很少或几乎没有边。这个问题几乎类似于寻找一个图的顶点割集,但有一个例外,即图需要划分为许多组件(它们的数量未知)。(请参阅此图)

这几乎就像不同的强连接组件在它们之间共享一对节点,我应该删除这些节点以分离这些强连接组件。边是经过加强的,但这个问题更像是在图中查找结构,所以边的加强并不相关。(思考这个问题的另一种方法是将实心球体在某些点上相互接触的情况可视化,其中球体是那些强连接的组件,而接触点是那些模棱两可的节点)

我正在制作一些东西的原型,所以我没有足够的时间自己学习图形聚类算法并选择最好的。另外,我需要一个能够剪切节点而不是边的解决方案,因为在我的例子中,不同的集群共享节点而不是边

是否有任何研究论文、博客解决了这一问题或与之相关的问题?或者任何人都能想出一个解决这个问题的办法,不管它有多脏

由于涉及数百万个节点和边,我需要解决方案的MapReduce实现。有什么输入和链接吗

MapReduce中是否有当前可直接使用的开源实现


我认为这个问题类似于通过删除顶点在在线社交网络中查找社区。

你的问题并不是那么简单。我担心这与集团问题有关,集团问题是NP完全问题,因此除非你以某种方式量化“集群之间几乎没有边”的说法,否则你的问题可能仍然非常困难。但如果我站在你的立场上,我会尝试一种肮脏、贪婪的方法,即将节点视为以下类型的准神经网络:

每个顶点我都会考虑输入、输出和SigMod激活函数,它将输入值(输入和)转换为输出值。输出值,我认为这是重要的,不会被克隆并发送给所有的邻居,而是均匀地划分在邻居之间。除此之外,我还要定义神经元活动的对数衰减(自我抑制,与自身的抑制性连接),由网络的全局衰减参数定义

现在,我将开始模拟,所有神经元从活动0.5开始(活动范围为0到1),具有非常高的衰减参数,这将导致所有神经元快速稳定在0状态。然后,我将逐渐减小衰变参数,直到稳态结果产生第一个具有非零稳定活度的团

问题是下一步该怎么办。一种可能是从图中减去找到的团,然后再次运行相同的过程,直到找到所有团。如果您的图确实像您所说的那样表现良好(实际上几乎是集群化的),那么这种贪婪的方法可能会成功,但否则可能会导致意外的结果。另一种可能性是,给发现的集团一种独特的集团气味,这种气味会让其他集团反感(相互抑制),重新运行算法直到找到第二个集团,给它一种不同的集团气味,让所有其他集团反感,等等,直到每个节点都有自己指定的气味

我想这将是我关于这件事的许多重大想法

关键是,由于在一般情况下(可能是NP完全)不可能解决这个问题,所以需要利用图的任何特殊属性。这意味着您需要使用参数一段时间,直到算法解决您遇到的99%的情况。我认为,如果不对您遇到的实际数据集进行长时间的实验,就不可能对您的问题给出数字上精确的答案

由于涉及数百万个节点和边,我需要解决方案的MapReduce实现。有什么输入和链接吗

根据我的经验,我怀疑在这里使用Map/Reduce是否真的有好处。前10^6个节点的顺序实际上并没有那么大[在非超连接图中也是如此,因为您正在考虑集群],并且过度使用Map/Reduce[除非您已经为其设置了硬件/软件]来解决您的问题是不值得的

Map/Reduce将更好地工作,一旦您解决了集群问题,然后希望使用类似的分析处理每个集群。基本上,您可以将任务分解为相对独立的子任务,这些子任务可以并行执行。这当然可以级联到多个层


在一个相对类似的情况下,我个人首先将我的图形建模到一个图形数据库中(我使用Neo4J,并极力推荐),然后对其运行分析和查询。您会惊讶于此解决方案对白板的友好程度,即使是大规模连接的查询也会在几乎瞬间执行,特别是在只有几百万个节点的规模下。例如,您可以根据分离度进行过滤分析,然后列出公用项

所以,让我试着沟通。您的图形是“几乎群集的”,所以您实际上有一个类似node.cluster的函数返回它所属的群集?对于某些节点,它返回2个集群?或者你希望我们帮你做这个功能吗