美文网首页
community detection

community detection

作者: chen_sheng | 来源:发表于2017-11-15 19:04 被阅读247次

    社区发现算法与可视化

    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

    相关文章

      网友评论

          本文标题:community detection

          本文链接:https://www.haomeiwen.com/subject/dwphvxtx.html