edgelist
= [[
'Mannheim'
,
'Frankfurt'
,
85
], [
'Mannheim'
,
'Karlsruhe'
,
80
], [
'Erfurt'
,
'Wurzburg'
,
186
], [
'Munchen'
,
'Numberg'
,
167
], [
'Munchen'
,
'Augsburg'
,
84
], [
'Munchen'
,
'Kassel'
,
502
], [
'Numberg'
,
'Stuttgart'
,
183
], [
'Numberg'
,
'Wurzburg'
,
103
], [
'Numberg'
,
'Munchen'
,
167
], [
'Stuttgart'
,
'Numberg'
,
183
], [
'Augsburg'
,
'Munchen'
,
84
], [
'Augsburg'
,
'Karlsruhe'
,
250
], [
'Kassel'
,
'Munchen'
,
502
], [
'Kassel'
,
'Frankfurt'
,
173
], [
'Frankfurt'
,
'Mannheim'
,
85
], [
'Frankfurt'
,
'Wurzburg'
,
217
], [
'Frankfurt'
,
'Kassel'
,
173
], [
'Wurzburg'
,
'Numberg'
,
103
], [
'Wurzburg'
,
'Erfurt'
,
186
], [
'Wurzburg'
,
'Frankfurt'
,
217
], [
'Karlsruhe'
,
'Mannheim'
,
80
], [
'Karlsruhe'
,
'Augsburg'
,
250
],[
"Mumbai"
,
"Delhi"
,
400
],[
"Delhi"
,
"Kolkata"
,
500
],[
"Kolkata"
,
"Bangalore"
,
600
],[
"TX"
,
"NY"
,
1200
],[
"ALB"
,
"NY"
,
800
]]
g = nx.Graph()
for edge in edgelist:
g.add_edge(edge[ 0 ],edge[ 1 ], weight = edge[ 2 ])
for i, x in enumerate(nx.connected_components(g)):
print ( "cc" +str(i)+ ":" ,x)
------------------------------------------------------------
cc0: { 'Frankfurt' , 'Kassel' , 'Munchen' , 'Numberg' , 'Erfurt' , 'Stuttgart' , 'Karlsruhe' , 'Wurzburg' , 'Mannheim' , 'Augsburg' }
cc1: { 'Kolkata' , 'Bangalore' , 'Mumbai' , 'Delhi' }
cc2: { 'ALB' , 'NY' , 'TX' }
-
零售:很多客户使用大量账户,可以利用连通分量算法寻找数据集中的不同簇类。假设使用相同信用卡的客户 ID 存在连边(edges),或者将该条件替换为相同的住址,或者相同的电话等。一旦我们有了这些连接的边,就可以使用连通分量算法来对客户 ID 进行聚类,并对每个簇类分配一个家庭 ID。然后,通过使用这些家庭 ID,我们可以根据家庭需求提供个性化建议。此外,通过创建基于家庭的分组功能,我们还能够提高分类算法的性能。
-
财务:我们可以利用这些家庭 ID 来识别金融欺诈。如果某个账户曾经有过欺诈行为,那么它的关联帐户很可能发生欺诈行为。
从鹿特丹到格罗宁根的最短途径是什么?或者换句话说:从特定城市到特定城市的最短路径是什么?这便是最短路径算法,而我只用了二十分钟就完成了该算法的设计。 一天早上,我和未婚妻在阿姆斯特丹购物,我们逛累了,便在咖啡馆的露台上喝了一杯咖啡。而我,就想着我能够做到这一点,于是我就设计了这个最短路径算法。正如我所说,这是一个二十分钟的发明。事实上,它发表于1959年,也就是三年后。它之所以如此美妙,其中一个原因在于我没有用铅笔和纸张就设计了它。后来我才知道,没有铅笔和纸的设计的一个优点就是,你几乎被迫避免所有可避免的复杂性。最终,这个算法让我感到非常惊讶,而且也成为了我名声的基石之一。
——Edsger Dijkstra于2001年接受ACM通讯公司 Philip L. Frana 的采访时的回答
print (nx.shortest_path(g, 'Stuttgart' , 'Frankfurt' ,weight= 'weight' ))
print (nx.shortest_path_length(g, 'Stuttgart' , 'Frankfurt' ,weight= 'weight' ))
--------------------------------------------------------
[ 'Stuttgart' , 'Numberg' , 'Wurzburg' , 'Frankfurt' ]
503
for x in nx.all_pairs_dijkstra_path(g,weight= 'weight' ):
print (x)
--------------------------------------------------------
( 'Mannheim' , { 'Mannheim' : [ 'Mannheim' ], 'Frankfurt' : [ 'Mannheim' , 'Frankfurt' ], 'Karlsruhe' : [ 'Mannheim' , 'Karlsruhe' ], 'Augsburg' : [ 'Mannheim' , 'Karlsruhe' , 'Augsburg' ], 'Kassel' : [ 'Mannheim' , 'Frankfurt' , 'Kassel' ], 'Wurzburg' : [ 'Mannheim' , 'Frankfurt' , 'Wurzburg' ], 'Munchen' : [ 'Mannheim' , 'Karlsruhe' , 'Augsburg' , 'Munchen' ], 'Erfurt' : [ 'Mannheim' , 'Frankfurt' , 'Wurzburg' , 'Erfurt' ], 'Numberg' : [ 'Mannheim' , 'Frankfurt' , 'Wurzburg' , 'Numberg' ], 'Stuttgart' : [ 'Mannheim' , 'Frankfurt' , 'Wurzburg' , 'Numberg' , 'Stuttgart' ]})
( 'Frankfurt' , { 'Frankfurt' : [ 'Frankfurt' ], 'Mannheim' : [ 'Frankfurt' , 'Mannheim' ], 'Kassel' : [ 'Frankfurt' , 'Kassel' ], 'Wurzburg' : [ 'Frankfurt' , 'Wurzburg' ], 'Karlsruhe' : [ 'Frankfurt' , 'Mannheim' , 'Karlsruhe' ], 'Augsburg' : [ 'Frankfurt' , 'Mannheim' , 'Karlsruhe' , 'Augsburg' ], 'Munchen' : [ 'Frankfurt' , 'Wurzburg' , 'Numberg' , 'Munchen' ], 'Erfurt' : [ 'Frankfurt' , 'Wurzburg' , 'Erfurt' ], 'Numberg' : [ 'Frankfurt' , 'Wurzburg' , 'Numberg' ], 'Stuttgart' : [ 'Frankfurt' , 'Wurzburg' , 'Numberg' , 'Stuttgart' ]})
....
-
Dijkstra 算法的变体在 Google 地图中广泛使用,用于计算最短的路线。
-
想象身处在沃尔玛商店,我们知道了各个过道之间的距离,我们希望为从过道 A 到过道 D 的客户提供最短路径。
-
如下图所示,当我们知道了领英中用户的一级连接、二级连接时,如何得知幕后的信息呢?Dijkstra 算法可以帮到我们。
# nx.minimum_spanning_tree ( g ) returns a instance of type graph
nx.draw_networkx ( nx.minimum_spanning_tree ( g ))
-
最小生成树在网络设计中有着最直接的应用,包括计算机网络,电信网络,运输网络,供水网络和电网。(最小生成树最初就是为此发明的)
-
最小生成树可用于求解旅行商问题的近似解
-
聚类——首先构造最小生成树,然后使用类间距离和类内距离来设定阈值,从而破坏最小生成树中的某些连边,最终完成聚类的目的
-
图像分割——首先在图形上构建最小生成树,其中像素是节点,像素之间的距离基于某种相似性度量(例如颜色,强度等),然后进行图的分割。
4、网页排序(Pagerank)
# reading the dataset
fb = nx.read_edgelist( '../input/facebook-combined.txt' , create_using = nx.Graph(), nodetype = int)
pos = nx.spring_layout(fb)
import warnings
warnings.filterwarnings( 'ignore' )
plt.style. use ( 'fivethirtyeight' )
plt.rcParams[ 'figure.figsize' ] = ( 20 , 15 )
plt.axis( 'off' )
nx.draw_networkx(fb, pos, with_labels = False , node_size = 35 )
plt.show()
pageranks = nx.pagerank(fb)
print(pageranks)
------------------------------------------------------
0.006289602618466542, :
1 : 0.00023590202311540972,
2 : 0.00020310565091694562,
3 : 0.00022552359869430617,
4 : 0.00023849264701222462,
........}
import operator
sorted_pagerank = sorted(pagerank.items(), key= operator .itemgetter( 1 ), reverse = True )
print (sorted_pagerank)
------------------------------------------------------
[( 3437 , 0.007614586844749603 ), ( 107 , 0.006936420955866114 ), ( 1684 , 0.0063671621383068295 ), ( 0 , 0.006289602618466542 ), ( 1912 , 0.0038769716008844974 ), ( 348 , 0.0023480969727805783 ), ( 686 , 0.0022193592598000193 ), ( 3980 , 0.002170323579009993 ), ( 414 , 0.0018002990470702262 ), ( 698 , 0.0013171153138368807 ), ( 483 , 0.0012974283300616082 ), ( 3830 , 0.0011844348977671688 ), ( 376 , 0.0009014073664792464 ), ( 2047 , 0.000841029154597401 ), ( 56 , 0.0008039024292749443 ), ( 25 , 0.000800412660519768 ), ( 828 , 0.0007886905420662135 ), ( 322 , 0.0007867992190291396 ),......]
first_degree_connected_nodes = list(fb.neighbors( 3437 ))
second_degree_connected_nodes = []
for x in first_degree_connected_nodes:
second_degree_connected_nodes+=list(fb.neighbors(x))
second_degree_connected_nodes. remove ( 3437 )
second_degree_connected_nodes = list( set (second_degree_connected_nodes))
subgraph_3437 = nx.subgraph(fb,first_degree_connected_nodes+second_degree_connected_nodes)
pos = nx.spring_layout(subgraph_3437)
node_color = [ 'yellow' if v == 3437 else 'red' for v in subgraph_3437]
node_size = [ 1000 if v == 3437 else 35 for v in subgraph_3437]
plt.style.use( 'fivethirtyeight' )
plt.rcParams[ 'figure.figsize' ] = ( 20 , 15 )
plt.axis( 'off' )
nx.draw_networkx(subgraph_3437, pos, with_labels = False, node_color=node_color,node_size=node_size )
plt.show()
-
已被用于根据引文寻找最具影响力的论文
-
已被谷歌用于网页排名
-
它可以对推文进行排名,其中,用户和推文作为网络的节点。如果用户 A 跟随用户 B,则在用户之间创建连边;如果用户推文或者转发推文,则在用户和推文之间建立连边。
-
用于推荐系统
https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.centrality.html#current-flow-closeness
-
介数中心性: 拥有最多朋友的用户很重要,而起到桥梁作用、将一个领域和另一个领域进行连接的用户也很重要,因为这样可以让更多的用户看到不同领域的内容。介数中心性衡量了特定节点出现在两个其他节点之间最短路径集的次数。
-
度中心性: 即节点的连接数。
pos = nx.spring_layout(subgraph_3437)
betweennessCentrality = nx.betweenness_centrality(subgraph_3437,normalized=True, endpoints=True)
node_size = [v * 10000 for v in betweennessCentrality.values()]
plt.figure(figsize=(20,20))
nx.draw_networkx(subgraph_3437, pos=pos, with_labels=False,
node_size=node_size )
plt.axis('off')
-
谷歌NIPS论文Transformer模型解读:只要Attention就够了
-
阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路
-
开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍
-
你在北边的西二旗被水淹没,我在东边的八通线不知所措
-
为什么说边缘计算的发展比5G更重要?
-
C/C++ 最易受攻击、70% 漏洞无效,揭秘全球开源组件安全现状
-
首批共享单车死于 2019
-
公钥加密、加密Hash散列、Merkle树……区块链的密码学你知多少?