Мне нужно разделить сеть на сообщества или кластеры.На каждой итерации я должен вычислить центральность всех узлов между узлами и найти узел с максимальным значением центральности между ними.Затем я продолжаю вычислять сходство узлов между этим узлом и всеми его соседями, используя коэффициент подобия Жакара.После этого я удалю ребра, которые имеют два наименьших значения подобия узла, с узлом с максимальной центральностью между ними.Процесс повторяется до тех пор, пока сеть полностью не распадется.
У меня есть две проблемы с кодом, который у меня есть в настоящее время.(1) Функция удаления ребер в настоящее время может удалять только ребра с наименьшим значением сходства, но я хочу сделать так, чтобы удалить ребра с 2 значениями наименьшего сходства.(2) Сценарий удаляет ребра только из узла 33 вместо того, чтобы выполнять итерацию по всем узлам после каждого удаления ребра.
Любая помощь, помогающая мне достичь желаемых результатов, будет высоко оценена.Также приветствуются предложения по ускорению и повышению эффективности кода.Код Python показан ниже:
import networkx as nx
import matplotlib.pyplot as plt
def Between_Centrality(G):
Bet_Centrality = nx.betweenness_centrality(G)
return Bet_Centrality
def removelink(graph,node):
neighbors = graph.neighbors(node)
l = list()
for neighbor in neighbors:
degree = nx.degree(graph,neighbor)
if(degree != 1):
l.append((node,neighbor))
pass
preds = nx.algorithms.jaccard_coefficient(graph,l)
minv = 1
rmvlinks = list()
for (i,j,v) in preds:
if(v<minv):
minv = v
rmvlinks.clear()
rmvlinks.append((i,j))
elif(v == minv):
rmvlinks.append((i, j))
print(rmvlinks)
graph.remove_edges_from(rmvlinks)
G = nx.karate_club_graph()
for i in range(len(G)):
betW = Between_Centrality(G)
sorted(betW.items(), key=lambda d:d[1], reverse = True)
maxB = max(list(betW))
removelink(G, maxB)
nx.draw(G)
plt.show()