k-regular与igraph的小世界网络

时间:2018-03-21 15:33:51

标签: python igraph

我正在使用igraph来生成节点具有相同度数的随机网络,使用K_Regular()函数。我想知道是否有一个类似的功能有一个小世界网络节点共享相同的程度。

我编写了自己的函数,相当快速地使用< 500节点,但在生成具有5000个节点的网络时有点慢。

我首先生成一个规则的格子,然后我会以很小的概率重新布线边缘:

g = igraph.Graph.Lattice([1,5000], nei=8, directed=False, mutual=True, circular=True)
for e in g.es:
    # if we randomize this link
    if random.uniform(0,1) < 0.05:
        # pick the nodes
        end1 = e.tuple[0]
        # pool
        pool = [n for n in range(0, g.vcount())]
        #
        end2 = random.choice([i for i in pool if i != end1 and i not in g.neighbors(end1)])
        # create link end1-end2
        if end1 < end2:
            g.add_edge(end1, end2)
        else:
            g.add_edge(end2, end1)
        # rewire the other end of this link
        end3 = e.tuple[1]
        # 
        end4 = random.choice([i for i in pool if i != end3\
                              and i in g.neighbors(end2)\
                              and i not in g.neighbors(end3)])
        # create link end3-end4
        if end3 < end4:
            g.add_edge(end3, end4)
        else:
            g.add_edge(end4, end3)
        # delete old edge
        g.delete_edges((e))
        g.delete_edges((end2, end4))

我看到了this,但说实话,我不知道如何指定重新布线的概率......

所以我想它可能是:

g = igraph.Graph.Lattice([1,5000], nei=8, directed=False, mutual=True, circular=True)
g.rewire(n=int(g.ecount()*0.05), mode="simple") # say you want a 0.05 prob

1 个答案:

答案 0 :(得分:0)

“小世界”不是严格定义的数量。所以在某种意义上你的问题是无法回答的。也就是说,平均距离与重新布线概率的关系通常非常有用,因为最小概率导致平均距离较短的图形。对于p=0.05,你肯定处于一种平均距离与常规图形相比相当小的区域(~5对比~160跳),并且增加重新布线的概率会使收益率大幅下降。

enter image description here

import numpy as np
import matplotlib.pyplot as plt
import igraph

rewiring_probability = np.logspace(-3., -1., 10.)
closeness_centrality = np.zeros_like(rewiring_probability)
g = igraph.Graph.Lattice([1,5000], nei=8, directed=False, mutual=True, circular=True)
E = g.ecount()

for ii, p in enumerate(rewiring_probability):
    print("Iteration {}, p = {}".format(ii, p))
    h = g.copy() # creates a deepcopy
    n = int(p * E)
    h.rewire(n=n, mode="simple")
    closeness_centrality[ii] = np.mean(h.closeness())

fig, ax = plt.subplots(1,1)
ax.plot(rewiring_probability, 1./closeness_centrality)
ax.set_xlabel('Rewiring probability')
ax.set_ylabel('Mean distance')
plt.show()