`
baiyejianxin
  • 浏览: 160879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据分析学习笔记(三)-NetworkX的使用

阅读更多

 

创建简单的空图形(没有边和点)
    
    import networkx as nx
    g = nx.Graph();
    
    h = nx.Graph( g);    #可以在构建Graph对象时指定值来构造一个新的Graph对象

    f = nx.Graph( [ (1,2),(2,3),(1,3)]);  #可以在构建Graph对象时指定node关系的数组来构建Graph对象

    根据定义,一个Graph就是一个所有nodes的集合。在NetworkX中,nodes能够代表任何对象,例如一个文本,一个图片,一个xml对象或者另外一个Graph,一个自定义的对象等等。
    由于NetworkX提供了多种Graph对象生成方法,并且体痛了读写方法来读写多种格式,所以Graph对象能够使用多种方式创建。

----------------------
Nodes
    
    graph对象能够添加node(节点)

    g.add_node(1);   #添加一个节点    
    g.add_nodes_from( [2,3])   #添加一个节点列表
    
    h = nx.path_graph(10)
    g.add_nodes_from( h)  #添加一个能够迭代的集合(例如:list, set, graph, file等等),这样g中包含了h中的元素
    g.add_node( h)    #这是将h作为一个node添加到g中
    g.add_nodes_from( 'span');   #将span拆分为一个字符数组,然后添加node

    Note: 最后,h是一个graph对象,将h最为g的node,是一个很灵活的特性。这样节点可以是graph中的graph,files中的graphs,method中的graph等等。值得思考的是,如果结构化你的应用使得那些node都是有用的实体。如果你愿意,你还可以是g对应一个唯一的表示,每个node对应一个被表示的key。如果node对应的是对象中的内容,那么当内容变化是,不应该修改对象,应该修改node对应的内容(有点绕)。

-----------------------
Edges

    graph对象中还能够添加edges(边);
    
    g.add_edge(1,2)    # 添加一个1和2之间的edge
    e=(2,3)                   #定义个关系
    g.add_edge( *e)    #添加关系对象

    g.add_edges_from([(1,2),(2,3)])  #添加一个edge数组
    g.add_edges_from( h.edges());   #h.edges()返回的h的包含所有edge的数组

    #拆除graph对象中的node和edge可以使用如下方法
    g.remove_node()
    g.remove_nodes_from()
    g.remove_edge()
    g.remove_edges_from()

    #删除所有的node和edge
    g.clear();

    #如果重复添加相同的node和edge,NetworkX将会将会忽略那些重复的内容。
    g.add_nodes_from("span");
    g.add_node( "s");
    
    #获取一个Graph对象中node和edge的数量
    g.number_of_nodes();
    g.number_of_edges();

    #获取一个Graph对象中的node数组或者edge数组
    g.nodes();
    g.edges();

    g.neighbors(1);   #获取与node为1相邻的node是节点
    g.remove_edge( 1,2);   #删除node1和node2之间的edge,自此node1和node2不再为相邻的node


------------------------------
如何使用nodes和edges?
    
    获取你已经注意到了node和edge并不是Graph的对象。这就能够使你更加灵活的使用node和edge,如果在python中使用string和number。node可以为任何hashable对象(除了Node),edge还可以和其他Graph对象中的node建立关联。例如:

        g.add_node( n1, n2, Graph=x);

        例如,n1,n2可以代表生物蛋白质资料库中两种蛋白质对象,x可以是代表一个观察实验出版物中的xml片段记录。
        
        如果熟悉他们,那么他们会非常有用。如果滥用也会带来意想不到的结果。如有疑问可以通过convert_node_labels_to_integers()方法来获得更多的有整数组成的传统图形。

-------------------------
除了使用上面提到的方法外,可以使用索引下标来访问edge
    
    >>>g[1]
    {2,{}}
    >>>g[1][1]
    {}
    
    Note:不要修改返回到额字典结构,它是graph固有的一部分,直接修改会导致不一致的状态

    同样通过下标可以设置edge的属性
    
    g.add_edge( 1, 3)
    g[1][1][ "color"] = "blue"

    通过迭代快速查找所有的edge
>>> FG=nx.Graph()
>>> FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
>>> for n,nbrs in FG.adjacency_iter():
...    for nbr,eattr in nbrs.items():
...        data=eattr['weight']
...        if data<0.5: print('(%d, %d, %.3f)' % (n,nbr,data))
(1, 2, 0.125)
(2, 1, 0.125)
(3, 4, 0.375)
(4, 3, 0.375)


--------------------
添加graph,node,edge的属性

        像color,label,weight或者其他Python对象的属性都可以被设置为graph,node,edge的属性。

        每个graph,node,edge都能够包含key/value这样的字典数据。默认情况下是没有这些属性的。可以通过add_node(),add_edge(),或者直接修改来添加和修改属性。

        Graph 属性
            
            g = nx.Graph( day="friday");
            g.graph
            打印:{“day”:“friday”}
    
            g.graph["day"]="Monday";
            g.graph
            打印:{"day":"Monday"}

        Node属性

            通过add_node(),add_nodes_from或者g.node来添加属性

            g.add_node( 1, time="5pm");
            g.add_nodes_from([3], time="2pm");
            g.node[ 1]
            打印:{"time":"5pm"}
            g.node[1]["room"]=714;
            g.nodes(data=True);
            打印:[(1,{"room":714, "time":"5pm"}),(3,{"time":"2pm"})]

            Note:向node添加属性并不会想graph添加属性,

        Edge属性

            通过add_edge(), add_edges_from()或者g.edge来添加属性

            g.add_edge(1,2,wegiht=4.7)
            g.add_edges_from( [ (2,3),(3,4) ], color="red")
            g.add_edges_from( [(1,2,{"color":"blue"}),(4,5,{"weight":8})])
            g[1][2]["width"]=4.7
            g.edge[1][2]["weight"]=4


-----------------------------
Directed graphs(有向图)
        
            DiGraph类针对有向edge提供了另外的方法,例如:out_edges(), in_degree(),predecessors(),successors()等。为了是算法能够正常运行,有向版本的neighbors()和degree()对于seccessor()方法是相同的。in_degree()和out_degree()都是独自的。
            
            ig = nx.DiGraph()
            ig.add_wieghted_edges_from( [(1,2,0.5),(2,3,0.7)])
            ig.out_degree( 1,weight="weight");
            打印:0.5
            ig.degree( 1, weight="weight");
            打印:1.25
            ig.seccessors(1)
            打印:[2]
            ig.neighbors(1)
            打印:[2]

        一些算法只对有向grapsh起作用,其他算法没有明确定义。同时使用有向graph和无向graph是非常危险的事情。如果想将有向graph转换为无向graph可以使用
        
            Graph.to_undirected()

            或者
            
            h = nx.Graph( g)

-------------------
Multigraphs
    
            NetworkX提供了类来实现一对node之间存在多个edge的实现类:MultiGraph和MultiDiGraph,他们都允许使用的edge数据添加多个的edge。对于某些应这个特性非常有用,但是很多算法在这种graph中并没有明确定义。

>>> MG=nx.MultiGraph()
>>> MG.add_weighted_edges_from([(1,2,.5), (1,2,.75), (2,3,.5)])
>>> MG.degree(weight='weight')
{1: 1.25, 2: 1.75, 3: 0.5}
>>> GG=nx.Graph()
>>> for n,nbrs in MG.adjacency_iter():
...    for nbr,edict in nbrs.items():
...        minvalue=min([d['weight'] for d in edict.values()])
...        GG.add_edge(n,nbr, weight = minvalue)
...
>>> nx.shortest_path(GG,1,3)
[1, 2, 3]

---------------------
Graph generators and graph operations(图形生成和操作)

        为了构建node-by-node或者edge-by-edge的graph,还可以使用以下方式。

        subgraph( G, nbunch)
        union( g1,g2)                 #合并praph
        disjoint_union( g1, g2) #假设所有node都不相同合并praph
        cartesian_product( g1, g2)  #返回笛卡尔产品praph
        compose( g1, g2)                 #合并公共的node
        complement( g1)                 #praph的补集
        create_empty_copy( g)        #返回某个praph对象的空的拷贝对象
        convert_to_undirected( g)   #返回一个无向praph
        convert_to_directed( g)       #返回一个有向的praph

        使用小图的调用

        petersen = nx.petersen_parph();
        tutte = nx.tutte_praph()
        maze = nx.sedgewick_maze_praph()
        tet = nx.tetrahedral_praph()

        使用典型praph的构造生成器
        
        k_4 = nx.complete_graph(4);
        k_3_5 = nx.complete_bipartite_graph(3,5)
        barbell = nx.barbell_graph( 10, 10)
        lollipop = nx.lollipop_graph( 10,20);

        使用随机graph生成器

>>> er=nx.erdos_renyi_graph(100,0.15)
>>> ws=nx.watts_strogatz_graph(30,3,0.1)
>>> ba=nx.barabasi_albert_graph(100,5)
>>> red=nx.random_lobster(100,0.9,0.9)
        从存储praph的文件中读取格式数据然后生成praph。
>>> nx.write_gml(red,"path.to.file")
>>> mygraph=nx.read_gml("path.to.file")
--------------
Analyzing graphs(分析图)

    结构话的praph能够使用提供的方法来进行分析:

        g = nx.Graph()
        g.add_edges_from( [(1,2),(1,3)])
        g.add_node( "spam")

        nx.connected_components( g)   #将node有关联的显示一个数组中。返回的为一个数组
        打印: [ [1,2,3], [ "spam"]]

        sorted( nx.degree( g).values())
        打印: [ 0, 1, 1, 2]

        nx.clustering( g)   #聚合
        打印: { 1 : 0.0, 2:0.0 , 3: 0.0 . "spam":0.0}

        nx.degree( g)        #显示等级
        打印:{1:2, 2:1,3:1,"spam":0}

        
        对于特殊的node,可以将一个单独的node或者node集合作为参数。如果传入一个独立的node,那么返回一个独立的值,如果传入一个node集合,这个方法将返回一个字典类型的数据    
        
        nx.degree(g,1)        #返回第一个node的值
        2
        
        g.degree( 1)           #返回第一个node的值
        2

        g.degree( 1, 2)       #返回从第一个node开始,前两个node的值
        {1:2, 2:1}

        sorted( g.degree( [ 1, 2]).values())  #返回1和2并排序输出结果
        [1,2]

        sorted( g.degree().values())            #返回g中node的权重,并排序输出结果

        想要了解更加详细的算法只是,参考:算法

---------------------
Drawing Praphs(绘制图形)
    
        NetworkX并不是首选的图形绘制包,但是它包含了基本的图形绘制工具开源包Matplotlib。如果需要的话可以引入network.drawing包。(更详细的文档参考:Drawing

        注意: NetworkX中的绘图包不和Python3兼容
        
        首先引入 Matplotlib的plot接口

        import matplotlib.pyplot as plt

        如果成功引入 networkx.drawing那么可以使用下面的方法绘制graph对象

        nx.draw( g)
        nx.draw_random( g)
        nx.draw_circular( g)
        nx.draw_spectral( g)

        将绘制的内容保存的一个文件中使用下面的方法
        nx.draw( g)
        plt.savefig( "path.png")

数据分析学习笔记(四)-使用NetworkX进行数据分析的实例
分享到:
评论

相关推荐

    复杂网络分析库NetworkX学习笔记.doc

    复杂网络分析库NetworkX学习笔记 NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了...NetworkX是一个功能强大且易于使用的复杂网络分析库,可以帮助我们更好的进行复杂网络数据分析和仿真建模等工作。

    networkx官网学习笔记.zip

    本篇学习笔记将深入剖析NetworkX的功能,帮助你掌握如何利用它来构建、分析和可视化复杂网络。 一、NetworkX的基本概念 NetworkX是一个用于创建、操作和研究复杂网络结构的Python库。它提供了丰富的数据结构(如图...

    (完整版)复杂网络分析库NetworkX学习笔记(1):入门.doc

    复杂网络分析库NetworkX学习笔记(1):入门 NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。下面是NetworkX的...

    复杂网络分析库NetworkX学习笔记(1):入门.docx

    它提供了一套丰富的内置算法,使得对复杂网络进行数据分析和仿真建模变得简单。无论你是网络科学的新手还是有经验的研究者,NetworkX都是一个值得探索的工具。 ### 安装NetworkX及其依赖 首先,你需要访问以下链接...

    python复杂网络工具 networkx

    **Python复杂网络工具NetworkX详解** NetworkX是一个用于创建、操作和研究复杂网络结构的..."复杂网络分析库NetworkX学习笔记.doc"和"networkx_reference.pdf"是进一步深入学习和掌握NetworkX的好资源,推荐仔细研读。

    NetworkX-graphs:带有Python Jupyter Notebook的存储库,该存储库实现了NetworkX来创建,分析和可视化不同的数据集

    在"NetworkX-graphs-main"这个存储库中,可能包含了多个示例Jupyter Notebook,每个都演示了如何使用NetworkX处理不同的数据集。这些数据集可能涉及社交网络、生物网络、交通网络等各种领域。通过这些笔记本,你可以...

    NoteforNSNAP_networkx_社会网络分析_python_

    总之,通过学习和使用Python的NetworkX库,我们可以对社会网络进行系统的研究,揭示隐藏的模式和规律,这对于理解和预测复杂的社会现象具有重大价值。无论是学术研究还是实际应用,社会网络分析都是一个强大且有价值...

    NetworkX_Tutorial:适用于15-388实用数据科学@ CMU的Jupyter笔记本教程。 根据Twitter关于分享推文数据的政策,请分别与作者联系以获取数据集

    对于教学和数据分析项目,Jupyter Notebook提供了便捷的方式,使得解释和展示分析过程变得简单。在这个教程中,我们将使用Jupyter Notebook来运行和展示NetworkX的示例代码。 **NetworkX基础** NetworkX的核心概念...

    Python库 | epd-2.1.2.tar.gz

    Python库是开发者在进行Python编程时经常会用到的工具,它们提供了一系列预定义的功能和模块,可以帮助程序员快速、高效地实现各种复杂任务。...无论是进行数据分析、机器学习还是Web服务,EPD都能提供强大的支持。

    上传学习CS224W图机器学习课程的笔记以及代码.zip

    8. **编程工具与框架**:在实现图机器学习模型时,通常会用到图库如NetworkX、PyTorch Geometric(PyG)、DGL等,以及深度学习框架如TensorFlow和PyTorch。 压缩包中的"content"文件可能包含了关于这些主题的详细...

    简单数据结构实现.zip

    这个压缩包可能包含了这些数据结构的代码实例、解剖分析以及相关的学习笔记,可以帮助初学者深入理解数据结构的原理和应用。对于程序员来说,熟练掌握数据结构是提升编程能力的关键步骤,因为它直接影响到程序的效率...

    Matlab树遍历代码-EAGL-GS:使用图拉普拉斯算子分析学习和总结图形模型:在多种慢性病分析中的应用

    Matlab树遍历代码EAGL:使用图拉普拉斯算子的特征分析学习和总结图形模型 使用图拉普拉斯特征分析总结图形模型(步骤) 图:提议的EAGL算法,用于总结基于可用数据集的有向概率图形模型。 使用代码: 提供了名为“”...

    python1903笔记 14_DS.zip

    【Python1903笔记14_DS.zip】这个压缩包文件是关于Python编程语言的数据结构(Data Structures)部分的学习笔记。数据结构是计算机科学中一个基础且重要的概念,它涉及如何在内存中有效地存储和组织数据,以便进行...

    2023图论课本pdf+笔记+习题课python代码+大作业

    通过学习这本教材,不仅可以掌握图论的基础理论,还能通过Python实践巩固知识,为软件开发和数据分析等领域打下坚实基础。书中可能还包括大作业题目,供读者进行深入的思考和练习,以提升对图论知识的运用能力。

    基于机器学习和深度学习的长短时量化交易算法.zip

    标题中的“基于机器学习和深度学习的长短时量化交易算法”揭示了这个压缩包内容的核心:它涉及到使用现代数据科学技术,特别是机器学习和深度学习,来构建能够在短期和长期交易中进行有效决策的算法。这样的算法通常...

    用于编程竞赛的Python库_Python_下载.zip

    Python-Competitive-Programming-Team-Notes-master可能包含了上述知识的实践案例、解题技巧和团队学习笔记,对于参赛者来说是宝贵的资源。通过深入学习和实践,参赛者可以提高解决编程问题的能力,更好地应对各种...

    2021数学建模美赛C题代码.zip

    通常,这种文件会展示如何将数学模型转化为计算机程序,例如用Python的Pandas进行数据处理,用Scikit-learn进行机器学习,或者用NetworkX进行复杂网络分析。 总的来说,这个压缩包资料对于数学建模的学习者来说是一...

    ggcd-samples:用于与“全球图庆祝日参加者图”一起使用的示例代码

    它广泛应用于数据分析、机器学习和教学等场景。在这个项目中,Jupyter Notebook 很可能是用来演示如何构建和解析“全球图庆祝日参加者图”的工具。 在 "ggcd-samples-master" 这个压缩包中,我们通常会找到以下几类...

    Graph-Exercise:CS492

    - Python是一种高级编程语言,特别适合教学和数据分析,其丰富的库如NetworkX可以帮助我们轻松处理图结构。 - 在项目中,可能使用了Python的类和函数来构建和操作图对象。 7. **应用实例**: - 社交网络分析:如...

    blogs:支持我的图数据科学博客文章的Jupyter笔记本,网址为https

    5. **可视化技巧**:使用内嵌的可视化库(如matplotlib或networkx)展示图数据,帮助理解复杂网络结构。 6. **案例研究**:可能涵盖真实世界问题的解决方案,如社交网络分析、欺诈检测或知识图谱构建。 通过这些...

Global site tag (gtag.js) - Google Analytics