Networkx 弹簧布局边缘权重

use*_*er0 3 python networkx

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

“另一种模型考虑每对节点 (i,j) 的类似弹簧的力,其中每个弹簧的理想长度 delta_{ij} 与节点 i 和 j 之间的图论距离成正比,而不使用单独的排斥力。最小化节点之间的欧几里得距离和理想距离之间的差异(通常是平方差)相当于度量多维缩放问题。

具体来说,边缘权重是如何考虑的?

Joe*_*oel 5

这不是一个很好的答案,但它提供了基础知识。其他人可能会真正了解 Fruchterman-Reingold 算法并能描述它。我根据我在代码中找到的内容给出解释。

\n

文档来看,

\n
\n

权重:字符串或无可选(默认=\xe2\x80\x99weight\xe2\x80\x99)

\n
\n
\n

边属性保存用于边权重的数值。如果无,则所有边权重均为 1。

\n
\n

但这并没有告诉你它对重量的作用,这是你的问题。

\n

你可以找到源代码。如果您发送加权边,它将A使用这些权重创建一个邻接矩阵并传递A_fruchterman_reingold.

\n

看看那里的代码,它的重点就在这一行

\n
displacement=np.transpose(np.transpose(delta)*\\\n    (k*k/distance**2-A*distance/k)).sum(axis=1)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

这是描述该算法的论文的链接,不幸的是该论文位于付费墙后面。这是作者网页上论文的链接

\n