给定边列表模拟指定节点属性同配性的Python实现
需求说明
我需要模拟带有指定节点属性同配性(assortativity)的小世界网络:流程为先生成小世界网络G = (V,E),再为节点生成属性,使得该属性的同配性为指定值x。
核心问题可明确表述为:
给定网络边列表,为每个节点分配
[0,1]区间内的取值,令该取值的数值同配系数等于指定值x。
现有基于NetworkX的Python示例代码如下,需要补全其中make_assort函数的实现逻辑:
import networkx as nx import random def make_assort(G, col, assort): # TODO # Returns a dict of attributes for graph G that gives # an assortaivity coefficent of `assort` for `col` vals = nx.get_node_attributes(G, col) return vals # Generate graph G = nx.watts_strogatz_graph(n = 100, k = 4, p = 0.5) # Generate initial preferences random.seed(10) prefs = {n:random.uniform(0,1) for n in range(len(G))} nx.set_node_attributes(G, prefs, "pref") print("Current assortativity", nx.numeric_assortativity_coefficient(G, "pref")) # Generate new preferences with assortivity = alpha new_vals = make_assort(G, "pref", assort=0.5) nx.set_node_attributes(G, new_vals, "pref") print("New assortativity", nx.numeric_assortativity_coefficient(G, "pref"))
实现方案
直接用迭代调整的方式实现make_assort即可,不需要复杂的矩阵运算,逻辑很直接:
- 先读入已有的节点初始属性值,作为调整的起点
- 每轮先计算当前网络的实际同配系数,和目标值的差小于阈值(默认设0.001就够用)就直接退出
- 每轮随机抽一条边做调整:
- 如果当前同配比目标值低,就把这条边两个端点的属性值往二者的平均值拉,让相连节点属性更接近,抬升同配性
- 如果当前同配比目标值高,就把两个端点的属性值往反方向推,让相连节点属性差更大,降低同配性
- 每次调整完都把值卡到
[0,1]区间里,避免跑出范围
补全后的函数代码如下,直接替换原来的TODO部分就能跑:
def make_assort(G, col, assort, max_iter=20000, tol=1e-3, step=0.01): vals = nx.get_node_attributes(G, col) edges = list(G.edges()) for _ in range(max_iter): # 临时写入当前值计算同配系数 nx.set_node_attributes(G, vals, col) current_r = nx.numeric_assortativity_coefficient(G, col) if abs(current_r - assort) < tol: break # 随机选一条边调整 u, v = random.choice(edges) u_val, v_val = vals[u], vals[v] if current_r < assort: # 同配不足,缩小两端点值差距 mid = (u_val + v_val) / 2 vals[u] += step * (mid - u_val) vals[v] += step * (mid - v_val) else: # 同配过高,扩大两端点值差距 delta = v_val - u_val vals[u] -= step * delta vals[v] += step * delta # 把值限制在[0,1]区间 vals[u] = max(0.0, min(1.0, vals[u])) vals[v] = max(0.0, min(1.0, vals[v])) return vals
几个可调参数说明:
max_iter:最大迭代次数,节点多的话可以适当调大,避免没收敛就退出tol:允许的同配系数误差,要求精度高就调小step:每次调整的步长,网络规模大可以适当调小,避免调整震荡
跑示例代码时,初始随机属性的同配性基本在0附近浮动,调整后输出的新同配性会稳定在0.5左右,误差不超过0.001,符合要求。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

