community detection

社区发现算法与可视化

from community import community_louvain

因为community 不能够直接导入我想要的best_partition,在这里我找到了community库里面的community_louvain能够直接调用,效果是一样的

import networkx as nx

import matplotlib.pyplot as plt

这里把绘图和计算复杂网络的库导入

#better with karate_graph() as defined in networkx example.

#erdos renyi don't have true community structure

#G = nx.erdos_renyi_graph(30, 0.05)

#first compute the best partition

partition = community_louvain.best_partition(G)

#drawing

size = float(len(set(partition.values())))

pos = nx.spring_layout(G)

count = 0.

for com in set(partition.values()) :

count = count + 1.

list_nodes = [nodes for nodes in partition.keys()

if partition[nodes] == com]

nx.draw_networkx_nodes(G, pos, list_nodes, node_size = 20,

node_color = str(count / size))

nx.draw_networkx_edges(G,pos, alpha=0.5)

plt.show()

这里我们把方法就介绍完了。

我导入以下数据,大概有17万组数据,如图所示34282组是节点数据,后边10多万的edges数据,我们首先把它导入。

community detection_第1张图片
绘制大型演化图的挑战可以通过各种方式来解决。作为提交,欢迎任何基于比赛数据的可视化,包括动画,静态图像,子图和比赛图的派生。除了可视化之外,我们还鼓励参赛者提交补充材料,如图形的背景相关性,案例研究,概念,算法,实验,结构结果等,以有意义的方式解决这类数据的可视化问题。比赛数据提供基于互联网电影数据库的真实世界的数据集 。该图是二部图,其中每个节点对应于演员或电影。电影和电影中的每个演员之间都有一个边缘。而且,这些数据在节点上包含以下属性:•指示节点是否对应于电影的“电影”(类型布尔值)•指示电影名称的“名称”。actor(类型字符串)•年的电影(类型int); 属性为0,如果节点是演员或年份是未知的•电影类型(字符串类型)

以上是数据的简要描述。我们要做的就是怎么去做community detection.

导入数据

nodeID=list()

nodeName =list()

nodeWeight =list()

nodeType =list()

edge1 =list()

edge2 =list()

with open('newmovies.txt') as n:

lines = n.readlines()[1:1000]

for line in lines:

nodeID.append(line.strip().split('\t')[0])

nodeName.append(line.strip().split('\t')[1])

nodeWeight.append(line.strip().split('\t')[2])

nodeType.append(line.strip().split('\t')[3])

with open('newmovies.txt') as e:

lines = e.readlines()[34285:36285]

for line in lines:

edge1.append(line.strip().split('\t')[0])

edge2.append(line.strip().split('\t')[1])

然后运行这段代码,意思是,用networkx里面的算法,用绘图工具matplotlib展现出来。

import networkx as nx

G = nx.Graph()

G.add_nodes_from(nodeID,name=nodeName,weight=nodeWeight,ntype=nodeType)

for x in range(0,len(edge1)):

G.add_edge(edge1[x], edge2[x])

G.number_of_nodes()

partition = community_louvain.best_partition(G)

size =float(len(set(partition.values())))

pos = nx.spring_layout(G)

count =0.

for com in set(partition.values()) :

count = count +1.

list_nodes = [nodesfornodesinpartition.keys()

                        if partition[nodes] == com]

nx.draw_networkx_nodes(G, pos, list_nodes,node_size=20,

                node_color=str(count / size))

nx.draw_networkx_edges(G,pos,alpha=0.5)

plt.show()

community detection_第2张图片
最终结果图

结合以上实验进行分析:

1 从图表可以看出导演、演员、作家和电影的分布。相同的属性或类型将出现在同一个社区中。

2 它包含10个主题:美国电影演员,美国电视演员,黑人和白人电影,戏剧电影,喜剧电影,英国电影,美国电影导演,独立电影,美国电影剧本,美国舞台演员。不同的类型也被分成不同的群体。

3 通过实验分析,中部地区的人物是作家和导演,和外面的代表电影和演员

4 彼此之间有重叠,如作家和导演可以创建多个作品和电影,它们是通过许多演员

5 从内到外,该中心是作者导演,演员和电影。

完成了分析,perfect!

如有兴趣,联系我。。微信:cs757592433

你可能感兴趣的:(community detection)