Как удалить ребра с двумя значениями наименьшего сходства для узла? - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно разделить сеть на сообщества или кластеры.На каждой итерации я должен вычислить центральность всех узлов между узлами и найти узел с максимальным значением центральности между ними.Затем я продолжаю вычислять сходство узлов между этим узлом и всеми его соседями, используя коэффициент подобия Жакара.После этого я удалю ребра, которые имеют два наименьших значения подобия узла, с узлом с максимальной центральностью между ними.Процесс повторяется до тех пор, пока сеть полностью не распадется.

У меня есть две проблемы с кодом, который у меня есть в настоящее время.(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()
...