Networkx弹簧布局边缘权重

时间:2015-03-09 02:43:10

标签: python networkx

我想知道spring_layout如何考虑边缘权重。来自维基百科,

'另一种模型考虑每对节点(i,j)的弹簧力,其中每个弹簧的理想长度\ delta_ {ij}与节点i和j之间的图论理论距离成比例,使用单独的排斥力。最小化欧几里德与节点之间理想距离之间的差异(通常是平方差)则等同于度量多维尺度问题。'

边缘权重如何计算,特别是?

1 个答案:

答案 0 :(得分:3)

这不是一个很好的答案,但它提供了基础知识。其他人可能来自实际上知道Fruchterman-Reingold算法的人并且可以描述它。我根据代码中的内容给出了解释。

来自documentation

  

weight:string或None optional(默认='weight')

     

包含用于边权重的数值的edge属性。如果为None,则所有边权重均为1.

但是,这并没有告诉你它对体重的影响,这是你的问题。

您可以找到source code。如果您发送加权边,则会创建一个包含这些权重的邻接矩阵A,并将A传递给_fruchterman_reingold

查看那里的代码,它的内容就在这一行 displacement=np.transpose(np.transpose(delta)*\ (k*k/distance**2-A*distance/k))\ .sum(axis=1)

A*distance正在计算弹簧力对节点的作用强度。相应A条目中较大的值意味着在这两个节点之间存在相对较强的吸引力(或者如果它们非常靠近,则排斥力较弱)。然后算法根据力的方向和强度移动节点。然后重复(默认为50次)。有趣的是,如果您查看源代码,您会注意到tdt。似乎在每次迭代时,力乘以越来越小的因子,因此步数变小。

以下是描述算法的paper的链接,不幸的是,它位于付费专区之后。以下是作者网页

上的论文的a link