尽管您已经接受了@abdallah-sobehy 的答案,这意味着它有效,但我建议采用更简单的方法,以防它对您或周围的任何人有所帮助。
您尝试做的有时称为优先连接(好吧,至少在您添加节点时),并且很久以前开发了一个随机模型,请参阅Barabasi-Albert 模型,它导致等式的幂律gamma
分布-3。
基本上,您必须添加概率等于节点度数除以所有节点度数之和的边。您可以scipy.stats使用这样的代码定义概率分布,
import scipy.stats as stats
x = Gx.nodes()
sum_degrees = sum(list(Gx.degree(Gx).values()))
p = [Gx.degree(x)/sum_degrees for x in Gx]
custm = stats.rv_discrete(name='custm', values=(x, p))
然后,您只需按照该分布选择 2 个节点,这就是您添加边的 2 个节点,
custm.rvs(size=2)
至于删除节点,我自己没试过。但我想你可以使用这样的东西,
sum_inv_degrees = sum([1/ x for x in list(Gx.degree(Gx).values())])
p = [1 / (Gx.degree(x) * sum_inv_degrees) for x in Gx]
虽然老实说我不完全确定;它不再是我上面链接到的随机模型......
无论如何,希望它有所帮助。
评论后更新
实际上,通过使用这种方法向现有图表添加节点,您可能会得到 2 个不希望的结果:
您可以删除这些,尽管它会使结果偏离预期的分布。
无论如何,您应该考虑到您已经偏离了优先连接模型,因为 Barabasi-Albert 研究的算法可以向现有图添加新节点和链接,
该网络以 m_0 个节点的初始连接网络开始。一次将一个新节点添加到网络中。每个新节点连接到 m > m_0 个现有节点的概率与数量成正比...
(见这里)
如果您想获得精确的分布(而不是扩大现有网络并保持其属性),您可能最好使用@joel 的答案
希望能帮助到你。