我正在研究大规模神经元网络的模拟,我需要生成代表网络拓扑的随机图。
我希望能够指定这些图的以下属性:
理想情况下,应从满足这些用户指定标准的所有可能图形的集合中统一绘制随机图。
目前我正在使用一种非常粗略的随机扩散方法,我开始使用具有所需大小和全局连接概率的Erdos-Renyi随机网络,然后在每一步中我随机重新连接一部分边缘。如果重新布线使我更接近所需的 C ,那么我将重新连接的网络保留到下一次迭代中。
这是我目前的Python实现:
import igraph
import numpy as np
def generate_fixed_gcc(n, p, target_gcc, tol=1E-3):
"""
Creates an Erdos-Renyi random graph of size n with a specified global
connection probability p, which is then iteratively rewired in order to
achieve a user- specified global clustering coefficient.
"""
# initialize random graph
G_best = igraph.Graph.Erdos_Renyi(n=n, p=p, directed=True, loops=False)
loss_best = 1.
n_edges = G_best.ecount()
# start with a high rewiring rate
rewiring_rate = n_edges
n_iter = 0
while loss_best > tol:
# operate on a copy of the current best graph
G = G_best.copy()
# adjust the number of connections to rewire according to the current
# best loss
n_rewire = min(max(int(rewiring_rate * loss_best), 1), n_edges)
G.rewire(n=n_rewire)
# compute the global clustering coefficient
gcc = G.transitivity_undirected()
loss = abs(gcc - target_gcc)
# did we improve?
if loss < loss_best:
# keep the new graph
G_best = G
loss_best = loss
gcc_best = gcc
# increase the rewiring rate
rewiring_rate *= 1.1
else:
# reduce the rewiring rate
rewiring_rate *= 0.9
n_iter += 1
# get adjacency matrix as a boolean numpy array
M = np.array(G_best.get_adjacency().data, dtype=np.bool)
return M, n_iter, gcc_best
这适用于小型网络( N &lt; 500),但随着节点数量的增加,它很快变得难以处理。生成200节点图需要大约20秒,生成1000节点图需要几天。
有人能建议一种有效的方法吗?
答案 0 :(得分:4)
你是对的。这是一种非常昂贵的方法来实现你想要的。我只能推测是否有一种数学上合理的方法来优化并确保它接近于均匀分布。我甚至不确定你的方法是否会导致均匀分布,尽管它似乎会这样。让我试试:
基于the docs for transitivity_undirected
和wikipedia Clustering Coefficient,听起来可以在图表中进行本地更改,同时了解对全局连接和全局群集的确切影响。
全局聚类系数基于节点的三元组。三元组由三个节点组成,这两个节点由两个(开放三元组)或三个(封闭三元组)无向连接相连。三角形由三个封闭的三元组组成,一个以每个节点为中心。全局聚类系数是三元组总数(开放和关闭)的封闭三元组(或3个三角形)的数量。
(* edit *)根据我对ali_m引用的论文的阅读,下面的方法可能会在低度聚类上花费太多的边缘,导致图形无法达到所需的聚类系数,除非它非常低(无论如何这可能都不会有用)。因此,如果有人实际使用此功能,您将需要识别更高度数的聚类以添加边缘,以便快速提高聚类系数,而无需添加大量边缘。
另一方面,下面的方法与研究论文中的方法一致,所以它或多或少是一种合理的方法。
如果我理解正确,您可以执行以下操作:
按照您的方式制作图表。
计算并跟踪:
p_surplus
用于跟踪需要在其他地方添加或删除以保持连接的边数cc_top
,cc_btm
跟踪聚类系数迭代(不完全)选择随机对并连接或断开它们以单调 在保持已有的连接性(p)的同时,接近所需的聚类系数(cc)。
伪代码:
for random_pair in random_pairs:
if (random_pair is connected) and (need to reduce cc or p): # maybe put priority on the one that has a larger gap?
delete the edge
p_surplus -= 1
cc_top -= broken_connected_triplets # have to search locally
cc_btm -= (broken_connected_triplets + broken_open_triplets) # have to search locally
elif (random_pair is not connected) add (need to increase c or p):
add the edge
p_surplus += 1
cc_top += new_connected_triplets
cc_btm += (new_connected_triplets + new_open_triplets)
if cc and p are within desired ranges:
done
if some condition for detecting infinite loops:
rethink this method
这可能不完全正确,但我认为这种方法会奏效。效率 搜索本地三元组并始终在正确的方向上移动参数会更好 而不是复制图表和全局测量cc这么多次。
答案 1 :(得分:4)
做了一些阅读后,看起来好像最好的解决方案可能是this paper中提出的Gleeson算法的通用版本。但是,我仍然不了解如何实施它,所以暂时我一直在研究Bansal et al's algorithm。
与我的天真方法一样,这是一种基于马尔可夫链的方法,它使用随机边缘交换,但与我的不同,它专门针对三元组图案&#39;在图表中重新布线:
由于这将更倾向于引入三角形,因此它将对聚类系数产生更大的影响。至少在无向图的情况下,重新布线步骤也保证保持度序列。同样,在每次重新布线迭代时,都会测量新的全局聚类系数,如果GCC更接近目标值,则接受新图。
Bansal等人实际上provided a Python implementation,但出于各种原因,我最终编写了自己的版本which you can find here。
与我的朴素扩散方法相比,Bansal方法占用迭代次数的一半以上,总时间的一半:
我希望获得更大的收益,但2倍的加速比没有好。
Bansal方法的另一个挑战是我的图表是定向的,而Bansal等人的算法仅设计用于无向图。使用有向图,不再保证重新布线步骤可以保留入度和出度序列。
我刚刚想出如何推广Bansal方法来保留有向图的入度和出度序列。诀窍是选择要交换的两个外边缘具有相反方向的图案({x,y1}和{x,y2}之间边缘的方向不重要):
我还进行了一些更优化,性能开始变得更加可观 - 与扩散方法相比,它需要大约一半的迭代次数和一半的总时间。我已用新的时间更新了上面的图表。
答案 2 :(得分:0)
我想出了一个图生成模型,该模型可以轻松生成大约 10,000 个节点的连接随机图,并且可以按照规定的度数和(局部)聚类系数分布生成任意所需的全局聚类系数分布。您可以找到简短的说明 here。顺便说一下,你会在参考文献中找到你的问题(这个)。
答案 3 :(得分:0)
科尔达等人。提出了 BTER model (2013),它可以生成具有规定度数和聚类系数分布(从而规定全局聚类指数)的随机图。它似乎比我的模型更复杂(见上文),但也许它更快或生成更少的偏差图。 (但老实说,我假设我的模型不会生成严重偏差的图,也不会生成,但基本上是随机图。)