300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 一文读懂Python复杂网络分析库networkx | CSDN博文精选

一文读懂Python复杂网络分析库networkx | CSDN博文精选

时间:2018-09-19 06:29:15

相关推荐

一文读懂Python复杂网络分析库networkx | CSDN博文精选

作者 |yyl424525来源 | CSDN博客

文章目录

1. 简介

安装

支持四种图

绘制网络图基本流程

2. Graph-无向图节点边属性有向图和无向图互转3. DiGraph-有向图

一些精美的图例子

环形树状图

权重图

Giant Component

Random Geometric Graph 随机几何图

节点颜色渐变

边的颜色渐变

Atlas

画个五角星

Club

画一个多层感知机

绘制一个DNN结构图

一些图论算法

最短路径

4. 问题

一些其他神经网络绘制工具列表

5. 参考1 简介networkx是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。networkx支持创建简单无向图、有向图和多重图(multigraph);内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。networkx以图(graph)为基本数据结构。图既可以由程序生成,也可以来自在线数据源,还可以从文件与数据库中读取。安装安装的话,跟其他包的安装差不多,用的是anaconda就不用装了。其他就用pip install networkx。查看版本:

1>>>importnetworkx

2>>>networkx.__version__

3'1.11'

升级

1pipinstall--upgradenetworkx

下面配合使用的一些库,可以选择性安装:

后面可能用到pygraphviz,安装方法如下(亲测有效):

1sudoapt-getinstallgraphviz

2sudoapt-getinstallgraphvizlibgraphviz-devpkg-config

3sudoapt-getinstallpython-pippython-virtualenv

4pipinstallpygraphviz

windows的安装参考这篇博客:/fadai1993/article/details/82491657#2____linux_9安装cv2:

1pipinstallopencv-python#安装非常慢,用下面的方式,从清华源下载

2pip3install-ihttps://pypi.tuna./simpleopencv-python

支持四种图

Graph:无多重边无向图

DiGraph:无多重边有向图

MultiGraph:有多重边无向图

MultiDiGraph:有多重边有向图

空图对象的创建方式

1importnetworkxasnx

2G=nx.Graph()

3G=nx.DiGraph()

4G=nx.MultiGraph()

5G=nx.MultiDiGraph()

6G.clear()#清空图

绘制网络图基本流程

导入networkx,matplotlib包

建立网络

绘制网络 nx.draw()

建立布局 pos = nx.spring_layout美化作用

最基本画图程序

1importimportnetworkxasnx#导入networkx包

2importmatplotlib.pyplotasplt

3G=nx.random_graphs.barabasi_albert_graph(100,1)#生成一个BA无标度网络G

4nx.draw(G)#绘制网络G

5plt.savefig("ba.png")#输出方式1:将图像存为一个png格式的图片文件

6plt.show()#输出方式2:在窗口中显示这幅图像

networkx 提供画图的函数

1draw(G,[pos,ax,hold])

2draw_networkx(G,[pos,with_labels])

3draw_networkx_nodes(G,pos,[nodelist])绘制网络G的节点图

4draw_networkx_edges(G,pos[edgelist])绘制网络G的边图

5draw_networkx_edge_labels(G,pos[,…])绘制网络G的边图,边有label

6—有layout布局画图函数的分界线—

7draw_circular(G,**kwargs)DrawthegraphGwithacircularlayout.

8draw_random(G,**kwargs)DrawthegraphGwitharandomlayout.

9draw_spectral(G,**kwargs)DrawthegraphGwithaspectrallayout.

10draw_spring(G,**kwargs)DrawthegraphGwithaspringlayout.

11draw_shell(G,**kwargs)Drawnetworkxgraphwithshelllayout.

12draw_graphviz(G[,prog])Drawnetworkxgraphwithgraphvizlayout.

networkx 画图函数里的一些参数

pos(dictionary, optional): 图像的布局,可选择参数;如果是字典元素,则节点是关键字,位置是对应的值。如果没有指明,则会是spring的布局;也可以使用其他类型的布局,具体可以查阅networkx.layout

arrows :布尔值,默认True; 对于有向图,如果是True则会画出箭头

with_labels: 节点是否带标签(默认为True)

ax:坐标设置,可选择参数;依照设置好的Matplotlib坐标画图

nodelist:一个列表,默认G.nodes(); 给定节点

edgelist:一个列表,默认G.edges();给定边

node_size: 指定节点的尺寸大小(默认是300,单位未知,就是上图中那么大的点)

node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如’r’为红色,'b’为绿色等,具体可查看手册),用“数据字典”赋值的时候必须对字典取值(.values())后再赋值

node_shape: 节点的形状(默认是圆形,用字符串’o’标识,具体可查看手册)

alpha: 透明度 (默认是1.0,不透明,0为完全透明)

cmap:Matplotlib的颜色映射,默认None; 用来表示节点对应的强度

vmin,vmax:浮点数,默认None;节点颜色映射尺度的最大和最小值

linewidths:[None|标量|一列值];图像边界的线宽

width: 边的宽度 (默认为1.0)

edge_color: 边的颜色(默认为黑色)

edge_cmap:Matplotlib的颜色映射,默认None; 用来表示边对应的强度

edge_vmin,edge_vmax:浮点数,默认None;边的颜色映射尺度的最大和最小值

style: 边的样式(默认为实现,可选:solid|dashed|dotted,dashdot)

labels:字典元素,默认None;文本形式的节点标签

font_size: 节点标签字体大小 (默认为12)

font_color: 节点标签字体颜色(默认为黑色)

node_size:节点大小

font_weight:字符串,默认’normal’

font_family:字符串,默认’sans-serif’

布局指定节点排列形式

circular_layout:节点在一个圆环上均匀分布

random_layout:节点随机分布shell_layout:节点在同心圆上分布

spring_layout:用Fruchterman-Reingold算法排列节点,中心放射状分布

spectral_layout:根据图的拉普拉斯特征向量排列节点

布局也可用pos参数指定,例如,nx.draw(G, pos = spring_layout(G)) 这样指定了networkx上以中心放射状分布.

2 Graph-无向图如果添加的节点和边是已经存在的,是不会报错的,NetworkX会自动忽略掉已经存在的边和节点的添加。节点常用函数

nodes(G):在图节点上返回一个迭代器

number_of_nodes(G):返回图中节点的数量

all_neighbors(graph, node):返回图中节点的所有邻居

non_neighbors(graph, node):返回图中没有邻居的节点

common_neighbors(G, u, v):返回图中两个节点的公共邻居

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3G=nx.Graph()#建立一个空的无向图G

4#增加节点

5G.add_node('a')#添加一个节点1

6G.add_nodes_from(['b','c','d','e'])#加点集合

7G.add_cycle(['f','g','h','j'])#加环

8H=nx.path_graph(10)#返回由10个节点的无向图

9G.add_nodes_from(H)#创建一个子图H加入G

10G.add_node(H)#直接将图作为节点

11

12nx.draw(G,with_labels=True,node_color='red')

13plt.show()

14

15#访问节点

16print('图中所有的节点',G.nodes())

17#图中所有的节点[0,1,2,3,'a','c','f',7,8,9,<networkx.classes.graph.Graphobjectat0x7fdf7d0d2780>,'g','e','h','b',4,6,5,'j','d']

18

19print('图中节点的个数',G.number_of_nodes())

20#图中节点的个数20

21

22#删除节点

23G.remove_node(1)#删除指定节点

24G.remove_nodes_from(['b','c','d','e'])#删除集合中的节点

常用函数

edges(G[, nbunch]):返回与nbunch中的节点相关的边的视图

number_of_edges(G):返回图中边的数目

non_edges(graph):返回图中不存在的边

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3

4#添加边方法1

5

6F=nx.Graph()#创建无向图

7F.add_edge(11,12)#一次添加一条边

8

9#添加边方法2

10e=(13,14)#e是一个元组

11F.add_edge(*e)#这是python中解包裹的过程

12

13#添加边方法3

14F.add_edges_from([(1,2),(1,3)])#通过添加list来添加多条边

15

16H=nx.path_graph(10)#返回由10个节点的无向图

17#通过添加任何ebunch来添加边

18F.add_edges_from(H.edges())#不能写作F.add_edges_from(H)

19

20nx.draw(F,with_labels=True)

21plt.show()

22

23#访问边

24print('图中所有的边',F.edges())

25#图中所有的边[(0,1),(1,2),(1,3),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9),(11,12),(13,14)]

26

27print('图中边的个数',F.number_of_edges())

28#图中边的个数12

29

30

31

32#删除边

33F.remove_edge(1,2)

34F.remove_edges_from([(11,12),(13,14)])

35

36nx.draw(F,with_labels=True)

37plt.show()

使用邻接迭代器遍历每一条边

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3

4#快速遍历每一条边,可以使用邻接迭代器实现,对于无向图,每一条边相当于两条有向边

5FG=nx.Graph()

6FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.275)])

7forn,nbrsinFG.adjacency_iter():

8fornbr,eattrinnbrs.items():

9data=eattr['weight']

10print('(%d,%d,%0.3f)'%(n,nbr,data))

11#(1,2,0.125)

12#(1,3,0.750)

13#(2,1,0.125)

14#(2,4,1.200)

15#(3,1,0.750)

16#(3,4,0.275)

17#(4,2,1.200)

18#(4,3,0.275)

19

20print('***********************************')

21

22#筛选weight小于0.5的边:

23FG=nx.Graph()

24FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.275)])

25forn,nbrsinFG.adjacency_iter():

26fornbr,eattrinnbrs.items():

27data=eattr['weight']

28ifdata<0.5:

29print('(%d,%d,%0.3f)'%(n,nbr,data))

30#(1,2,0.125)

31#(2,1,0.125)

32#(3,4,0.275)

33#(4,3,0.275)

34

35print('***********************************')

36

37#一种方便的访问所有边的方法:

38foru,v,dinFG.edges(data='weight'):

39print((u,v,d))

40#(1,2,0.125)

41#(1,3,0.75)

42#(2,4,1.2)

43#(3,4,0.275)

属性属性诸如weight,labels,colors,或者任何对象,都可以附加到图、节点或边上。对于每一个图、节点和边都可以在关联的属性字典中保存一个(多个)键-值对。默认情况下这些是一个空的字典,但是可以增加或者是改变这些属性。图的属性

1#图的属性

2

3importnetworkxasnx

4

5G=nx.Graph(day='Monday')#可以在创建图时分配图的属性

6print(G.graph)

7

8G.graph['day']='Friday'#也可以修改已有的属性

9print(G.graph)

10

11G.graph['name']='time'#可以随时添加新的属性到图中

12print(G.graph)

13

14输出:

15{'day':'Monday'}

16{'day':'Friday'}

17{'day':'Friday','name':'time'}

节点的属性

1#节点的属性

2importnetworkxasnx

3

4G=nx.Graph(day='Monday')

5G.add_node(1,index='1th')#在添加节点时分配节点属性

6#print(G.node(data=True))#TypeError:'dict'objectisnotcallable

7print(G.node)

8#{1:{'index':'1th'}}

9

10

11G.node[1]['index']='0th'#通过G.node[][]来添加或修改属性

12print(G.node)

13#{1:{'index':'0th'}}

14

15

16G.add_nodes_from([2,3],index='2/3th')#从集合中添加节点时分配属性

17print(G.node)

18#{1:{'index':'0th'},2:{'index':'2/3th'},3:{'index':'2/3th'}}

边的属性

1#边的属性

2importnetworkxasnx

3

4G=nx.Graph(day='manday')

5G.add_edge(1,2,weight=10)#在添加边时分配属性

6print(G.edges(data=True))

7#[(1,2,{'weight':10})]

8

9G.add_edges_from([(1,3),(4,5)],len=22)#从集合中添加边时分配属性

10print(G.edges(data='len'))

11#[(1,2,None),(1,3,22),(4,5,22)]

12

13G.add_edges_from([(3,4,{'hight':10}),(1,4,{'high':'unknow'})])

14print(G.edges(data=True))

15#[(1,2,{'weight':10}),(1,3,{'len':22}),(1,4,{'high':'unknow'}),(3,4,{'hight':10}),(4,5,{'len':22})]

16

17

18G[1][2]['weight']=100000#通过G[][][]来添加或修改属性

19print(G.edges(data=True))

20#[(1,2,{'weight':100000}),(1,3,{'len':22}),(1,4,{'high':'unknow'}),(3,4,{'hight':10}),(4,5,{'len':22})]

有向图和无向图互转有向图和多重图的基本操作与无向图一致。无向图与有向图之间可以相互转换,转化方法如下:

1#有向图转化成无向图

2

3H=DG.to_undirected()

4#或者

5H=nx.Graph(DG)

6

7#无向图转化成有向图

8

9F=H.to_directed()

10#或者

11F=nx.DiGraph(H)

3、DiGraph-有向图

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3

4G=nx.DiGraph()

5G.add_node(1)

6G.add_node(2)

7G.add_nodes_from([3,4,5,6])

8G.add_cycle([1,2,3,4])

9G.add_edge(1,3)

10G.add_edges_from([(3,5),(3,6),(6,7)])

11nx.draw(G,node_color='red')

12plt.savefig("youxiangtu.png")

13plt.show()

1from__future__importdivision

2importmatplotlib.pyplotasplt

3importnetworkxasnx

4

5G=nx.generators.directed.random_k_out_graph(10,3,0.5)

6pos=nx.layout.spring_layout(G)

7

8node_sizes=[3+10*iforiinrange(len(G))]

9M=G.number_of_edges()

10edge_colors=range(2,M+2)

11edge_alphas=[(5+i)/(M+4)foriinrange(M)]

12

13nodes=nx.draw_networkx_nodes(G,pos,node_size=node_sizes,node_color='blue')

14edges=nx.draw_networkx_edges(G,pos,node_size=node_sizes,arrowstyle='->',

15arrowsize=10,edge_color=edge_colors,

16edge_cmap=plt.cm.Blues,width=2)

17#setalphavalueforeachedge

18foriinrange(M):

19edges[i].set_alpha(edge_alphas[i])

20

21ax=plt.gca()

22ax.set_axis_off()

23plt.savefig("directed.jpg")

24plt.show()

一些精美的图例子

环形树状图

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3

4try:

5importpygraphviz

6fromnetworkx.drawing.nx_agraphimportgraphviz_layout

7exceptImportError:

8try:

9importpydot

10fromnetworkx.drawing.nx_pydotimportgraphviz_layout

11exceptImportError:

12raiseImportError("ThisexampleneedsGraphvizandeither"

13"PyGraphvizorpydot")

14

15G=nx.balanced_tree(3,5)

16pos=graphviz_layout(G,prog='twopi',args='')

17plt.figure(figsize=(8,8))

18nx.draw(G,pos,node_size=20,alpha=0.5,node_color="blue",with_labels=False)

19plt.axis('equal')

20plt.show()

权重图

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3

4G=nx.Graph()

5

6G.add_edge('a','b',weight=0.6)

7G.add_edge('a','c',weight=0.2)

8G.add_edge('c','d',weight=0.1)

9G.add_edge('c','e',weight=0.7)

10G.add_edge('c','f',weight=0.9)

11G.add_edge('a','d',weight=0.3)

12

13elarge=[(u,v)for(u,v,d)inG.edges(data=True)ifd['weight']>0.5]

14esmall=[(u,v)for(u,v,d)inG.edges(data=True)ifd['weight']<=0.5]

15

16pos=nx.spring_layout(G)#positionsforallnodes

17

18#nodes

19nx.draw_networkx_nodes(G,pos,node_size=700)

20

21#edges

22nx.draw_networkx_edges(G,pos,edgelist=elarge,

23width=6)

24nx.draw_networkx_edges(G,pos,edgelist=esmall,

25width=6,alpha=0.5,edge_color='b',style='dashed')

26

27#labels

28nx.draw_networkx_labels(G,pos,font_size=20,font_family='sans-serif')

29

30plt.axis('off')

31plt.savefig("weight.jpg")

32plt.show()

Giant Component

1importmath

3

4importmatplotlib.pyplotasplt

5importnetworkxasnx

6

7try:

8importpygraphviz

9fromnetworkx.drawing.nx_agraphimportgraphviz_layout

10layout=graphviz_layout

11exceptImportError:

12try:

13importpydot

14fromnetworkx.drawing.nx_pydotimportgraphviz_layout

15layout=graphviz_layout

16exceptImportError:

17print("PyGraphvizandpydotnotfound;\n"

18"drawingwithspringlayout;\n"

19"willbeslow.")

20layout=nx.spring_layout

21

22n=150#150nodes

23#pvalueatwhichgiantcomponent(ofsizelog(n)nodes)isexpected

24p_giant=1.0/(n-1)

25#pvalueatwhichgraphisexpectedtobecomecompletelyconnected

26p_conn=math.log(n)/float(n)

27

28#thefollowingrangeofpvaluesshouldbeclosetothethreshold

29pvals=[0.003,0.006,0.008,0.015]

30

31region=220#forpylab2x2subplotlayout

32plt.subplots_adjust(left=0,right=1,bottom=0,top=0.95,wspace=0.01,hspace=0.01)

33forpinpvals:

34G=nx.binomial_graph(n,p)

35pos=layout(G)

36region+=1

37plt.subplot(region)

38plt.title("p=%6.3f"%(p))

39nx.draw(G,pos,

40with_labels=False,

41node_size=10

42)

43#identifylargestconnectedcomponent

44Gcc=sorted(nx.connected_component_subgraphs(G),key=len,reverse=True)

45G0=Gcc[0]

46nx.draw_networkx_edges(G0,pos,

47with_labels=False,

48edge_color='r',

49width=6.0

50)

51#showotherconnectedcomponents

52forGiinGcc[1:]:

53iflen(Gi)>1:

54nx.draw_networkx_edges(Gi,pos,

55with_labels=False,

56edge_color='r',

57alpha=0.3,

58width=5.0

59)

60plt.show()

Random Geometric Graph 随机几何图

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3

4G=nx.random_geometric_graph(200,0.125)

5#positionisstoredasnodeattributedataforrandom_geometric_graph

6pos=nx.get_node_attributes(G,'pos')

7

8#findnodenearcenter(0.5,0.5)

9dmin=1

10ncenter=0

11forninpos:

12x,y=pos[n]

13d=(x-0.5)**2+(y-0.5)**2

14ifd<dmin:

15ncenter=n

16dmin=d

17

18#colorbypathlengthfromnodenearcenter

19p=dict(nx.single_source_shortest_path_length(G,ncenter))

20

21plt.figure(figsize=(8,8))

22nx.draw_networkx_edges(G,pos,nodelist=[ncenter],alpha=0.4)

23nx.draw_networkx_nodes(G,pos,nodelist=list(p.keys()),

24node_size=80,

25node_color=list(p.values()),

26cmap=plt.cm.Reds_r)

27

28plt.xlim(-0.05,1.05)

29plt.ylim(-0.05,1.05)

30#plt.axis('off')

31plt.show()

节点颜色渐变

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3G=nx.cycle_graph(24)

4pos=nx.spring_layout(G,iterations=200)

5nx.draw(G,pos,node_color=range(24),node_size=800,cmap=plt.cm.Blues)

6plt.savefig("node.jpg")

7plt.show()

边的颜色渐变

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3

4G=nx.star_graph(20)

5pos=nx.spring_layout(G)#布局为中心放射状

6colors=range(20)

7nx.draw(G,pos,node_color='#A0CBE2',edge_color=colors,

8width=4,edge_cmap=plt.cm.Blues,with_labels=False)

9plt.show()

Atlas

1importrandom

2

3try:

4importpygraphviz

5fromnetworkx.drawing.nx_agraphimportgraphviz_layout

6exceptImportError:

7try:

8importpydot

9fromnetworkx.drawing.nx_pydotimportgraphviz_layout

10exceptImportError:

11raiseImportError("ThisexampleneedsGraphvizandeither"

12"PyGraphvizorpydot.")

13

14importmatplotlib.pyplotasplt

15

16importnetworkxasnx

17fromnetworkx.algorithms.isomorphism.isomorphimportgraph_could_be_isomorphicasisomorphic

18fromnetworkx.generators.atlasimportgraph_atlas_g

19

20

21defatlas6():

22"""Returntheatlasofallconnectedgraphsof6nodesorless.

23Attempttocheckforisomorphismsandremove.

24"""

25

26Atlas=graph_atlas_g()[0:208]#208

27#removeisolatednodes,onlyconnectedgraphsareleft

28U=nx.Graph()#graphforunionofallgraphsinatlas

29forGinAtlas:

30zerodegree=[nforninGifG.degree(n)==0]

31forninzerodegree:

32G.remove_node(n)

33U=nx.disjoint_union(U,G)

34

35#iteratorofgraphsofallconnectedcomponents

36C=(U.subgraph(c)forcinnx.connected_components(U))

37

38UU=nx.Graph()

39#doquickisomorphic-likecheck,notatrueisomorphismchecker

40nlist=[]#listofnonisomorphicgraphs

41forGinC:

42#checkagainstallnonisomorphicgraphssofar

43ifnotiso(G,nlist):

44nlist.append(G)

45UU=nx.disjoint_union(UU,G)#unionthenonisomorphicgraphs

46returnUU

47

48

49defiso(G1,glist):

50"""Quickanddirtynonisomorphismcheckerusedtocheckisomorphisms."""

51forG2inglist:

52ifisomorphic(G1,G2):

53returnTrue

54returnFalse

55

56

57if__name__=='__main__':

58G=atlas6()

59

60print("graphhas%dnodeswith%dedges"

61%(nx.number_of_nodes(G),nx.number_of_edges(G)))

62print(nx.number_connected_components(G),"connectedcomponents")

63

64plt.figure(1,figsize=(8,8))

65#layoutgraphswithpositionsusinggraphvizneato

66pos=graphviz_layout(G,prog="neato")

67#colornodesthesameineachconnectedsubgraph

68C=(G.subgraph(c)forcinnx.connected_components(G))

69forginC:

70c=[random.random()]*nx.number_of_nodes(g)#randomcolor...

71nx.draw(g,

72pos,

73node_size=40,

74node_color=c,

75vmin=0.0,

76vmax=1.0,

77with_labels=False

78)

79plt.show()

画个五角星

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3#画图!

4G=nx.Graph()

5G.add_node(1)

6G.add_nodes_from([2,3,4,5])

7foriinrange(5):

8forjinrange(i):

9if(abs(i-j)notin(1,4)):

10G.add_edge(i+1,j+1)

11nx.draw(G,

12with_labels=True,#这个选项让节点有名称

13edge_color='b',#bstandsforblue!

14pos=nx.circular_layout(G),#这个是选项选择点的排列方式,具体可以用help(nx.drawing.layout)查看

15#主要有spring_layout(default),random_layout,circle_layout,shell_layout

16#这里是环形排布,还有随机排列等其他方式

17node_color='r',#r=red

18node_size=1000,#节点大小

19width=3,#边的宽度

20)

21plt.savefig("star.jpg")

22plt.show()

Club

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3importnetworkx.algorithms.bipartiteasbipartite

4

5G=nx.davis_southern_women_graph()

6women=G.graph['top']

7clubs=G.graph['bottom']

8

9print("Biadjacencymatrix")

10print(bipartite.biadjacency_matrix(G,women,clubs))

11

12#projectbipartitegraphontowomennodes

13W=bipartite.projected_graph(G,women)

14print('')

15print("#Friends,Member")

16forwinwomen:

17print('%d%s'%(W.degree(w),w))

18

19#projectbipartitegraphontowomennodeskeepingnumberofco-occurence

20#thedegreecomputedisweightedandcountsthetotalnumberofsharedcontacts

21W=bipartite.weighted_projected_graph(G,women)

22print('')

23print("#Friendmeetings,Member")

24forwinwomen:

25print('%d%s'%(W.degree(w,weight='weight'),w))

26

27nx.draw(G,node_color="red")

28plt.savefig("club.jpg")

29plt.show()

画一个多层感知机

1importmatplotlib.pyplotasplt

2importnetworkxasnx

3left,right,bottom,top,layer_sizes=.1,.9,.1,.9,[4,7,7,2]

4#网络离上下左右的距离

5#layter_sizes可以自己调整

6importrandom

7G=nx.Graph()

8v_spacing=(top-bottom)/float(max(layer_sizes))

9h_spacing=(right-left)/float(len(layer_sizes)-1)

10node_count=0

11fori,vinenumerate(layer_sizes):

12layer_top=v_spacing*(v-1)/2.+(top+bottom)/2.

13forjinrange(v):

14G.add_node(node_count,pos=(left+i*h_spacing,layer_top-j*v_spacing))

15node_count+=1

16#这上面的数字调整我想了好半天,汗

17forx,(left_nodes,right_nodes)inenumerate(zip(layer_sizes[:-1],layer_sizes[1:])):

18foriinrange(left_nodes):

19forjinrange(right_nodes):

20G.add_edge(i+sum(layer_sizes[:x]),j+sum(layer_sizes[:x+1]))

21

22pos=nx.get_node_attributes(G,'pos')

23#把每个节点中的位置pos信息导出来

24nx.draw(G,pos,

25node_color=range(node_count),

26with_labels=True,

27node_size=200,

28edge_color=[random.random()foriinrange(len(G.edges))],

29width=3,

30cmap=plt.cm.Dark2,#matplotlib的调色板,可以搜搜,很多颜色

31edge_cmap=plt.cm.Blues

32)

33plt.savefig("mlp.jpg")

34plt.show()

绘制一个DNN结构图

1#-*-coding:utf-8-*-

2importnetworkxasnx

3importmatplotlib.pyplotasplt

4

5#创建DAG

6G=nx.DiGraph()

7

8#顶点列表

9vertex_list=['v'+str(i)foriinrange(1,22)]

10#添加顶点

11G.add_nodes_from(vertex_list)

12

13#边列表

14edge_list=[

15('v1','v5'),('v1','v6'),('v1','v7'),('v1','v8'),('v1','v9'),

16('v2','v5'),('v2','v6'),('v2','v7'),('v2','v8'),('v2','v9'),

17('v3','v5'),('v3','v6'),('v3','v7'),('v3','v8'),('v3','v9'),

18('v4','v5'),('v4','v6'),('v4','v7'),('v4','v8'),('v4','v9'),

19('v5','v10'),('v5','v11'),('v5','v12'),('v5','v13'),('v5','v14'),('v5','v15'),

20('v6','v10'),('v6','v11'),('v6','v12'),('v6','v13'),('v6','v14'),('v6','v15'),

21('v7','v10'),('v7','v11'),('v7','v12'),('v7','v13'),('v7','v14'),('v7','v15'),

22('v8','v10'),('v8','v11'),('v8','v12'),('v8','v13'),('v8','v14'),('v8','v15'),

23('v9','v10'),('v9','v11'),('v9','v12'),('v9','v13'),('v9','v14'),('v9','v15'),

24('v10','v16'),('v10','v17'),('v10','v18'),

25('v11','v16'),('v11','v17'),('v11','v18'),

26('v12','v16'),('v12','v17'),('v12','v18'),

27('v13','v16'),('v13','v17'),('v13','v18'),

28('v14','v16'),('v14','v17'),('v14','v18'),

29('v15','v16'),('v15','v17'),('v15','v18'),

30('v16','v19'),

31('v17','v20'),

32('v18','v21')

33]

34#通过列表形式来添加边

35G.add_edges_from(edge_list)

36

37#绘制DAG图

38plt.title('DNNforiris')#图片标题

39

40nx.draw(

41G,

42node_color='red',#顶点颜色

43edge_color='black',#边的颜色

44with_labels=True,#显示顶点标签

45font_size=10,#文字大小

46node_size=300#顶点大小

47)

48#显示图片

49plt.show()

可以看到,在代码中已经设置好了这22个神经元以及它们之间的连接情况,但绘制出来的结构如却是这样的:

这显然不是想要的结果,因为各神经的连接情况不明朗,而且很多神经都挤在了一起,看不清楚。之所以出现这种情况,是因为没有给神经元设置坐标,导致每个神经元都是随机放置的。接下来,引入坐标机制,即设置好每个神经元节点的坐标,使得它们的位置能够按照事先设置好的来放置,其Python代码如下:

1#-*-coding:utf-8-*-

2importnetworkxasnx

3importmatplotlib.pyplotasplt

4

5#创建DAG

6G=nx.DiGraph()

7

8#顶点列表

9vertex_list=['v'+str(i)foriinrange(1,22)]

10#添加顶点

11G.add_nodes_from(vertex_list)

12

13#边列表

14edge_list=[

15('v1','v5'),('v1','v6'),('v1','v7'),('v1','v8'),('v1','v9'),

16('v2','v5'),('v2','v6'),('v2','v7'),('v2','v8'),('v2','v9'),

17('v3','v5'),('v3','v6'),('v3','v7'),('v3','v8'),('v3','v9'),

18('v4','v5'),('v4','v6'),('v4','v7'),('v4','v8'),('v4','v9'),

19('v5','v10'),('v5','v11'),('v5','v12'),('v5','v13'),('v5','v14'),('v5','v15'),

20('v6','v10'),('v6','v11'),('v6','v12'),('v6','v13'),('v6','v14'),('v6','v15'),

21('v7','v10'),('v7','v11'),('v7','v12'),('v7','v13'),('v7','v14'),('v7','v15'),

22('v8','v10'),('v8','v11'),('v8','v12'),('v8','v13'),('v8','v14'),('v8','v15'),

23('v9','v10'),('v9','v11'),('v9','v12'),('v9','v13'),('v9','v14'),('v9','v15'),

24('v10','v16'),('v10','v17'),('v10','v18'),

25('v11','v16'),('v11','v17'),('v11','v18'),

26('v12','v16'),('v12','v17'),('v12','v18'),

27('v13','v16'),('v13','v17'),('v13','v18'),

28('v14','v16'),('v14','v17'),('v14','v18'),

29('v15','v16'),('v15','v17'),('v15','v18'),

30('v16','v19'),

31('v17','v20'),

32('v18','v21')

33]

34#通过列表形式来添加边

35G.add_edges_from(edge_list)

36

37#指定绘制DAG图时每个顶点的位置

38pos={

39'v1':(-2,1.5),

40'v2':(-2,0.5),

41'v3':(-2,-0.5),

42'v4':(-2,-1.5),

43'v5':(-1,2),

44'v6':(-1,1),

45'v7':(-1,0),

46'v8':(-1,-1),

47'v9':(-1,-2),

48'v10':(0,2.5),

49'v11':(0,1.5),

50'v12':(0,0.5),

51'v13':(0,-0.5),

52'v14':(0,-1.5),

53'v15':(0,-2.5),

54'v16':(1,1),

55'v17':(1,0),

56'v18':(1,-1),

57'v19':(2,1),

58'v20':(2,0),

59'v21':(2,-1)

60}

61#绘制DAG图

62plt.title('DNNforiris')#图片标题

63plt.xlim(-2.2,2.2)#设置X轴坐标范围

64plt.ylim(-3,3)#设置Y轴坐标范围

65nx.draw(

66G,

67pos=pos,#点的位置

68node_color='red',#顶点颜色

69edge_color='black',#边的颜色

70with_labels=True,#显示顶点标签

71font_size=10,#文字大小

72node_size=300#顶点大小

73)

74#显示图片

75plt.show()

可以看到,在代码中,通过pos字典已经规定好了每个神经元节点的位置。

接下来,需要对这个框架图进行更为细致地修改,需要修改的地方为:

去掉神经元节点的标签;

添加模型层的文字注释(比如Input layer)

其中,第二步的文字注释,我们借助opencv来完成。完整的Python代码如下:

1#-*-coding:utf-8-*-

2importcv2

3importnetworkxasnx

4importmatplotlib.pyplotasplt

5

6#创建DAG

7G=nx.DiGraph()

8

9#顶点列表

10vertex_list=['v'+str(i)foriinrange(1,22)]

11#添加顶点

12G.add_nodes_from(vertex_list)

13

14#边列表

15edge_list=[

16('v1','v5'),('v1','v6'),('v1','v7'),('v1','v8'),('v1','v9'),

17('v2','v5'),('v2','v6'),('v2','v7'),('v2','v8'),('v2','v9'),

18('v3','v5'),('v3','v6'),('v3','v7'),('v3','v8'),('v3','v9'),

19('v4','v5'),('v4','v6'),('v4','v7'),('v4','v8'),('v4','v9'),

20('v5','v10'),('v5','v11'),('v5','v12'),('v5','v13'),('v5','v14'),('v5','v15'),

21('v6','v10'),('v6','v11'),('v6','v12'),('v6','v13'),('v6','v14'),('v6','v15'),

22('v7','v10'),('v7','v11'),('v7','v12'),('v7','v13'),('v7','v14'),('v7','v15'),

23('v8','v10'),('v8','v11'),('v8','v12'),('v8','v13'),('v8','v14'),('v8','v15'),

24('v9','v10'),('v9','v11'),('v9','v12'),('v9','v13'),('v9','v14'),('v9','v15'),

25('v10','v16'),('v10','v17'),('v10','v18'),

26('v11','v16'),('v11','v17'),('v11','v18'),

27('v12','v16'),('v12','v17'),('v12','v18'),

28('v13','v16'),('v13','v17'),('v13','v18'),

29('v14','v16'),('v14','v17'),('v14','v18'),

30('v15','v16'),('v15','v17'),('v15','v18'),

31('v16','v19'),

32('v17','v20'),

33('v18','v21')

34]

35#通过列表形式来添加边

36G.add_edges_from(edge_list)

37

38#指定绘制DAG图时每个顶点的位置

39pos={

40'v1':(-2,1.5),

41'v2':(-2,0.5),

42'v3':(-2,-0.5),

43'v4':(-2,-1.5),

44'v5':(-1,2),

45'v6':(-1,1),

46'v7':(-1,0),

47'v8':(-1,-1),

48'v9':(-1,-2),

49'v10':(0,2.5),

50'v11':(0,1.5),

51'v12':(0,0.5),

52'v13':(0,-0.5),

53'v14':(0,-1.5),

54'v15':(0,-2.5),

55'v16':(1,1),

56'v17':(1,0),

57'v18':(1,-1),

58'v19':(2,1),

59'v20':(2,0),

60'v21':(2,-1)

61}

62#绘制DAG图

63plt.title('DNNforiris')#图片标题

64plt.xlim(-2.2,2.2)#设置X轴坐标范围

65plt.ylim(-3,3)#设置Y轴坐标范围

66nx.draw(

67G,

68pos=pos,#点的位置

69node_color='red',#顶点颜色

70edge_color='black',#边的颜色

71font_size=10,#文字大小

72node_size=300#顶点大小

73)

74

75#保存图片,图片大小为640*480

76plt.savefig('DNN_sketch.png')

77

78#利用opencv模块对DNN框架添加文字注释

79

80#读取图片

81imagepath='DNN_sketch.png'

82image=cv2.imread(imagepath,1)

83

84#输入层

85cv2.rectangle(image,(85,130),(120,360),(255,0,0),2)

86cv2.putText(image,"InputLayer",(15,390),1,1.5,(0,255,0),2,1)

87

88#隐藏层

89cv2.rectangle(image,(190,70),(360,420),(255,0,0),2)

90cv2.putText(image,"HiddenLayer",(210,450),1,1.5,(0,255,0),2,1)

91

92#输出层

93cv2.rectangle(image,(420,150),(460,330),(255,0,0),2)

94cv2.putText(image,"OutputLayer",(380,360),1,1.5,(0,255,0),2,1)

95

96#sofrmax层

97cv2.rectangle(image,(530,150),(570,330),(255,0,0),2)

98cv2.putText(image,"SoftmaxFunc",(450,130),1,1.5,(0,0,255),2,1)

99

100#保存修改后的图片

101cv2.imwrite('DNN.png',image)

一些图论算法

最短路径函数调用:

1dijkstra_path(G,source,target,weight=‘weight’)————求最短路径

2dijkstra_path_length(G,source,target,weight=‘weight’)————求最短距离

3

4importnetworkxasnx

5importpylab

6importnumpyasnp

7#自定义网络

8row=np.array([0,0,0,1,2,3,6])

9col=np.array([1,2,3,4,5,6,7])

10value=np.array([1,2,1,8,1,3,5])

11

12print('生成一个空的有向图')

13G=nx.DiGraph()

14print('为这个网络添加节点...')

15foriinrange(0,np.size(col)+1):

16G.add_node(i)

17print('在网络中添加带权中的边...')

18foriinrange(np.size(row)):

19G.add_weighted_edges_from([(row[i],col[i],value[i])])

20

21print('给网路设置布局...')

22pos=nx.shell_layout(G)

23print('画出网络图像:')

24nx.draw(G,pos,with_labels=True,node_color='white',edge_color='red',node_size=400,alpha=0.5)

25pylab.title('Self_DefineNet',fontsize=15)

26pylab.show()

27

28

29'''

30ShortestPathwithdijkstra_path

31'''

32print('dijkstra方法寻找最短路径:')

33path=nx.dijkstra_path(G,source=0,target=7)

34print('节点0到7的路径:',path)

35print('dijkstra方法寻找最短距离:')

36distance=nx.dijkstra_path_length(G,source=0,target=7)

37print('节点0到7的距离为:',distance)

输出:

1生成一个空的有向图

2为这个网络添加节点...

3在网络中添加带权中的边...

4给网路设置布局...

5画出网络图像:

6dijkstra方法寻找最短路径:

7节点0到7的路径:[0,3,6,7]

8dijkstra方法寻找最短距离:

9节点0到7的距离为:9

问题本人在pycharm中运行下列程序:

1importnetworkxasnx

2importmatplotlib.pyplotasplt

3

4G=nx.Graph()#建立一个空的无向图G

5G.add_node('a')#添加一个节点1

6G.add_nodes_from(['b','c','d','e'])#加点集合

7G.add_cycle(['f','g','h','j'])#加环

8H=nx.path_graph(10)#返回由10个节点挨个连接的无向图,所以有9条边

9G.add_nodes_from(H)#创建一个子图H加入G

10G.add_node(H)#直接将图作为节点

11

12nx.draw(G,with_labels=True)

13plt.show()

发现在Pycharm下使用matploylib库绘制3D图的时候,在最后需要显示图像的时候,每当输入plt.show() 都会报错

1plt.show()

2/yyl/Python/3.6/lib/python/site-packages/matplotlib/figure.py:1743:UserWarning:ThisfigureincludesAxesthatarenotcompatiblewithtight_layout,soitsresultsmightbeincorrect.

3warnings.warn("ThisfigureincludesAxesthatarenot"

4...

5ValueError:max()argisanemptysequence

网上的解决方案:File -> Setting -> Tools -> Python Scientific中去掉对Show plots in tool window的勾选就好了

一些其他神经网络绘制工具列表

上面都是一些这个网络库使用的一点总结,更多内容可以参考下面的官方链接。参考

官方教程:https://networkx.github.io/documentation/stable/_downloads/networkx_reference.pdf

官方网站:https://networkx.github.io/documentation/latest/index.html

官方githu博客:http://networkx.github.io/

用Python的networkx绘制精美网络图:/qq951127336/article/details/54586869

networkx整理:/minglex/p/9205160.html

Networkx使用指南:/Zhili_wang/article/details/89368177

论文中绘制神经网络工具汇总:/WZZ18191171661/article/details/87886588

networkx + Cytoscape构建及可视化网络图:/p/f62991aa1f8a

用python+graphviz/networkx画目录结构树状图:/XiaoPANGXia/article/details/53043664

扫码查看作者原文

▼▼▼

(*本文为 AI科技大本营转载文章,转载请联系原作者)

精彩推荐

中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

即日起,限量5 折票开售,数量有限,扫码购买,先到先得!

推荐阅读

确认!语音识别大牛Daniel Povey将入职小米,曾遭霍普金斯大学解雇,怒拒Facebook

大规模1.4亿中文知识图谱数据,我把它开源了

自动驾驶关键环节:行人的行为意图建模和预测(上)

不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

巨头垂涎却不能染指,loT 数据库风口已至

【建议收藏】数据中心服务器基础知识大全

从4个维度深度剖析闪电网络现状,在CKB上实现闪电网络的理由 | 博文精选

身边程序员同事竟说自己敲代码速度快!Ctrl+C、Ctrl+V ?

100 美元一行代码,开源软件到底咋赚钱?

你点的每个“在看”,我都认真当成了AI

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。