社区发现算法与可视化
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数据,我们首先把它导入。
绘制大型演化图的挑战可以通过各种方式来解决。作为提交,欢迎任何基于比赛数据的可视化,包括动画,静态图像,子图和比赛图的派生。除了可视化之外,我们还鼓励参赛者提交补充材料,如图形的背景相关性,案例研究,概念,算法,实验,结构结果等,以有意义的方式解决这类数据的可视化问题。比赛数据提供基于互联网电影数据库的真实世界的数据集 。该图是二部图,其中每个节点对应于演员或电影。电影和电影中的每个演员之间都有一个边缘。而且,这些数据在节点上包含以下属性:•指示节点是否对应于电影的“电影”(类型布尔值)•指示电影名称的“名称”。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()
结合以上实验进行分析:
1 从图表可以看出导演、演员、作家和电影的分布。相同的属性或类型将出现在同一个社区中。
2 它包含10个主题:美国电影演员,美国电视演员,黑人和白人电影,戏剧电影,喜剧电影,英国电影,美国电影导演,独立电影,美国电影剧本,美国舞台演员。不同的类型也被分成不同的群体。
3 通过实验分析,中部地区的人物是作家和导演,和外面的代表电影和演员
4 彼此之间有重叠,如作家和导演可以创建多个作品和电影,它们是通过许多演员
5 从内到外,该中心是作者导演,演员和电影。
完成了分析,perfect!
如有兴趣,联系我。。微信:cs757592433
网友评论