使用蛮力方法在社交网络中进行社区检测
先决条件- Python基础、 NetworkX 基础
我们将使用蛮力方法将图的节点划分为两个或多个社区。蛮力法意味着我们将尝试将每个节点划分为社区,并检查社区是否正确划分。我们将使用蛮力方法来完成这项任务。
算法:
- 创建一个包含 N 个节点及其边的图,或者采用像杠铃图这样的内置图。
- 现在取两个列表作为 FirstCommunity 和 SecondCommunity。
- 现在开始将节点放入社区,例如将第一个节点放入 FirstCommunity 并将 N-1 个节点放置到 SecondCommunity 并检查其内部和内部边缘。
- 现在我们将使用 itertools 进行组合。
- 对每个组合重复步骤 3 和 4。
- 现在通过取内部/社区间边数的比率来检查哪个划分是最好的。
- 现在找到具有最大比率的 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] ]