Я пытаюсь найти слабые связи, определенные Грановетером. До сих пор я пытался использовать измерения центральности для построения сетевого набора данных Stanford Facebook (facebook_combined.txt
) в соответствии с важностью. В приведенном ниже графике используется степень центра. Я указал синими прямоугольниками некоторые из узлов, которые я хочу найти ("слабые связи").
Мосты кажутся близкими, но не совсем там. Как следует искать эти узлы?
Пример кода:
import networkx as nx
fb = nx.read_edgelist("facebook_combined.txt")
degree_cent_fb = nx.degree_centrality(fb)
pos_fb = nx.spring_layout(fb ,iterations = 1000)
nsize = np.array ([v for v in degree_cent_fb.values ()])
nsize = 500*( nsize - min(nsize))/(max(nsize) - min(nsize))
nodes = nx.draw_networkx_nodes (fb , pos = pos_fb ,
node_size = nsize)
edges = nx.draw_networkx_edges (fb , pos = pos_fb ,
alpha = .1)
Вот еще несколько примеров с другими функциями калибровки:
Те же данные, размер которых зависит от центральности:
И центральность близости:
И с PageRank:
Обратите внимание, что слабые связи или мосты относятся к краям, и вы смотрите скорее на измерение уровня узла. Вы можете быть заинтересованы в концепции Рон Берт структурной дыры. Узлы, занимающие структурные отверстия, являются брокерами, соединяющими группы с ограниченным перекрытием - звучит так, как будто вы ищете.
NetworkX (начиная с версии 2.0, если я правильно помню) имеет реализацию меры ограничения Burt. Берт говорит, что узел занимает структурное отверстие, если он имеет низкое ограничение. Один минус оценка ограничения узлов, кажется, достаточно хорошо выделяет узлы между сообществами, хотя и не в каждом случае.
И вот код. Остерегайтесь - для вычисления ограничения требуется некоторое время!
fb = nx.read_edgelist("facebook_combined.txt")
pos_fb = nx.spring_layout(fb ,iterations = 100)
cons = nx.constraint(fb)
plt.figure(figsize=(15,10))
nsize = np.array ([1-v for v in cons.values()])
nsize = 10**(nsize+1)
nodes = nx.draw_networkx_nodes (fb , pos = pos_fb , node_color=nsize, cmap=plt.cm.coolwarm,
node_size = nsize)
edges = nx.draw_networkx_edges (fb , pos = pos_fb ,
alpha = .1)
plt.axis('off')