📜  使用蛮力方法在社交网络中进行社区检测

📅  最后修改于: 2022-05-13 01:55:41.545000             🧑  作者: Mango

使用蛮力方法在社交网络中进行社区检测

先决条件- Python基础 NetworkX 基础 

我们将使用蛮力方法将图的节点划分为两个或多个社区。蛮力法意味着我们将尝试将每个节点划分为社区,并检查社区是否正确划分。我们将使用蛮力方法来完成这项任务。

算法:

  1. 创建一个包含 N 个节点及其边的图,或者采用像杠铃图这样的内置图。
  2. 现在取两个列表作为 FirstCommunity 和 SecondCommunity。
  3. 现在开始将节点放入社区,例如将第一个节点放入 FirstCommunity 并将 N-1 个节点放置到 SecondCommunity 并检查其内部和内部边缘。
  4. 现在我们将使用 itertools 进行组合。
  5. 对每个组合重复步骤 3 和 4。
  6. 现在通过取内部/社区间边数的比率来检查哪个划分是最好的。
  7. 现在找到具有最大比率的 FirstCommunity 和 SecondCommunity 的值并打印该值。

下面是实现。

Python3
import networkx as nx
import itertools
  
  
def communities_using_brute(gfg):
  nodes = gfg.nodes()
  n = gfg.number_of_nodes()
  first_community = []
    
  for i in range(1, n//2 + 1):
    c = [list(a) for a in itertools.combinations(nodes, i)]
    first_community.extend(c)
  
  second_community = []
  
  for i in range(len(first_community)):
    b = list(set(nodes)-set(first_community[i]))
    second_community.append(b)
  
  # Which division is best...
  intra_edges1 = []
  intra_edges2 = []
  inter_edges = []
      
  # ratio of number of intra/number of inter
  # community edges
  ratio = []  
  
  for i in range(len(first_community)):
    intra_edges1.append(gfg.subgraph(first_community[i]).number_of_edges())
  
  for i in range(len(second_community)):
    intra_edges2.append(gfg.subgraph(second_community[i]).number_of_edges())
  
  e = gfg.number_of_edges()
  
  for i in range(len(first_community)):
    inter_edges.append(e-intra_edges1[i]-intra_edges2[i])
  
  # Calculate the Ratio
  
  for i in range(len(first_community)):
    ratio.append((float(intra_edges1[i]+intra_edges2[i]))/inter_edges[i])
  
  maxV=max(ratio)
  mindex=ratio.index(maxV)
  
  print('[ ', first_community[mindex], ' ] , [ ', second_community[mindex], ' ]')
  
# Example graph
gfg=nx.barbell_graph(5, 0)
communities_using_brute(gfg)


输出:

[ [0,1,2,3,4] ] , [ [8,9,5,6,7] ]