dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法

0162ebd517587af473d562c6038cf581.png

作者:Rahul Agarwal编译:刘静图灵联邦编辑部出品本文作者Rahul Agarwal是一位数据科学家,近期,他在Medium上分享了常用的5种图算法的介绍和代码实现。以下是具体博文内容:作为数据科学家,我们已经对Pandas或SQL或任何其他关系数据库非常熟悉了。我们习惯于将在行中看到用户,并且将他们的属性在列中展示。但现实世界真的是这样吗?在一个互联的世界里,用户不能被视为独立的实体。他们之间有一定的关系,我们在建立机器学习模型的时候,有时也会考虑这些关系。现在,虽然在关系数据库中,我们不能在不同的行(用户)之间使用这样的关系,但是在图数据库中,这样做是相当简单的。在这篇文章中,我将讨论一些您应该知道的最重要的图算法以及如何使用Python实现它们。此外,这里是UCSanDiego关于Coursera的大数据图表分析课程,我强烈建议您学习图理论的基础知识。课程链接:https://www.coursera.org/learn/big-data-graph-analytics

1、Connected Components(连通域)

26051e87850bfbf45f75384b75f79d97.png

一张包含3个Connected Components的图

大家应该都知道聚类是如何工作的吧?您可以将非常接近的Connected Components视为一种在相关/连接数据中查找群集/孤岛的硬聚类算法。举一个具体的例子:假设您有关于连接世界上任何两个城市的道路的数据。你的任务是需要找出世界上所有大陆以及它们所包含的城市。你将如何实现这一目标?来想一想吧。我们用于执行此操作的Connected Components算法是基于BFS / DFS的特殊情况。我不会在这里谈论它是如何工作的,但我们将看到如何使用Networkx启动和运行代码。应用从零售角度来看:假设,我们有很多客户使用大量账户。我们可以使用Connected Components算法的一种方法是在我们的数据集中找出不同的家庭。我们可以根据相同的信用卡使用情况、相同的地址或相同的移动电话号码等假定customer id之间的边(路)。一旦我们有了这些连接,我们就可以运行Connected Components算法来创建单独的集群,然后我们可以为其分配一个家庭ID。然后,我们可以使用这些家庭ID,来根据家庭需求提供个性化推荐。我们还可以使用这个家庭ID,通过创建基于家庭的分组功能来推动我们的分类算法。从财务角度来看:另一个用例是使用这些家庭ID捕获欺诈。如果某个帐户过去曾发生过欺诈行为,那么关联帐户很可能也容易受到欺诈。还有更多无限可能的应用,发挥自己的想象力吧。代码我们将使用Python中的Networkx模块来创建和分析图。让我们从一个示例图开始,我们使用它来实现我们的目的。包含城市和城市之间的距离信息。b457331bc778ed22cdcef030925b76cf.png带有随机距离的图我们首先创建一个边列表并且将添加为边权重的距离。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]]我们用 Networkx创建一个图: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'}如您所见,我们能够在数据中找到不同的Components。只需使用边缘和顶点。该算法可以在不同的数据上运行,以满足我上面提到的任何用例。

2、Shortest Path(最短路径)

3ae16fbe384f61e3d340eadf822113ef.png继续上述示例,我们将获得德国的城市及其相应距离的图。您想找到从法兰克福(起始节点)前往慕尼黑的最短距离。我们用来解决这个问题的算法叫做Dijkstra算法。用Dijkstra自己的话来说:从鹿特丹到格罗宁根的最短途径是什么:从特定城市到特定城市。这是最短路径的算法,我花了大约20分钟设计。一天早上,我和年轻的未婚妻在阿姆斯特丹购物,累了,我们坐在咖啡馆的露台上喝了一杯咖啡,我只想着能否做到这一点,然后我设计了最短路径的算法。正如我所说,这是一个20分钟的发明。事实上,它是在1959年出版的,三年后。该出版物仍然可读,事实上,它相当不错。它之所以如此美妙,其中一个原因就是我没用铅笔和纸张就设计了它。后来我才知道,没有铅笔和纸的设计的一个优点是你不得不避免所有可避免的复杂性。最终,令我大为惊讶的是,这个算法成了我成名的基石之一。-  Edsger Dijkstra,接受ACM通讯公司Philip L. Frana的采访,2001年应用
  • Dijkstra算法的变体在Google地图中广泛使用,以找到最短的路线。

  • You are in a Walmart Store. You have different Aisles and distance between all the aisles. You want to provide the shortest pathway to the customer from Aisle A to Aisle D.

  • 您在沃尔玛商店。你知道不同的过道和所有过道之间的距离信息。您想要为客户提供从A通道到D通道的最短路径。

    fd94bf7da9b8136a97131fdec4ef6c91.png

  • 你已经看到LinkedIn如何显示一级连接,二级连接。幕后发生了什么?

    0bf41681f36eb2de7404e5da97fce87c.png

    代码

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']})....

3、Minimum Spanning Tree(最小生成树)

48f2292b17f6f76ae59e44340a7b2b2d.png现在我们有另一个问题。我们在水管铺设公司或互联网光纤公司工作。我们需要使用最少量的电线/管道连接我们所拥有的图中的所有城市。我们如何做到这一点?f38ffb13b333d91e3951a7f274c97f6e.png无向图及其右边的MST。应用
  • 最小生成树在网络设计中具有直接应用,包括计算机网络,电信网络,运输网络,供水网络和电网(这个算法最初是为它们发明的)

  • MST用于近似商旅问题

  • 聚类 - 首先构造MST,然后使用群集间距离和群集间距确定用于破坏MST中某些边缘的阈值。

  • 图像分割 - 它用于图像分割,我们首先在图形上构建MST,其中像素是节点,像素之间的距离基于某种相似性度量(颜色,强度等)

代码# nx.minimum_spanning_tree(g) returns a instance of type graphnx.draw_networkx(nx.minimum_spanning_tree(g))

5539db63aa569a9994220c4c2cf65e21.png

我们图的MST。

正如你所看到的,上面是我们要铺设的电线。

4、Pagerank(网页排名)

79beca167dde62eae61fbf0a2c4b79ee.png这就是长期以来支持谷歌的页面排序算法。它根据输入和输出链接的数量和质量为每个网页分配分数。应用Pagerank可用于我们想要估算任何网络中节点重要性的任何地方。
  • 它已被用于使用引文找到最有影响力的论文。

  • 已被谷歌用于页面排名

  • 它可以用来给tweet排序——用户和tweet作为节点。如果用户A跟随用户B创建用户之间的链接,如果用户tweet / retwets一条tweet,则创建用户和tweet之间的链接

  • 推荐引擎

代码在本练习中,我们将使用Facebook数据。我们在facebook用户之间有一个边缘/链接文件。我们首先使用以下方法创建FB图:# reading the datasetfb = nx.read_edgelist('../input/facebook-combined.txt', create_using = nx.Graph(), nodetype = int)它是这样运作的:pos = nx.spring_layout(fb)import warningswarnings.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()825e4d5bb57b9f318c3ebe1132c41430.pngFB 用户图现在我们想要找到具有高影响力的用户。直观地说,Pagerank算法会给有很多朋友的用户打高分,而这些朋友又有很多facebook上的朋友。pageranks = nx.pagerank(fb)print(pageranks)------------------------------------------------------{0: 0.006289602618466542,1: 0.00023590202311540972,2: 0.00020310565091694562,3: 0.00022552359869430617,4: 0.00023849264701222462,........}我们可以使用以下方式获取已排序的PageRank或最有影响力的用户:import operatorsorted_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),......]以上ID适用于最有影响力的用户。我们可以看到最有影响力的用户的子图: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()f8e4b3f3775caf427b4116371072c942.png我们最有影响力的用户(黄色)

5、 Centrality Measures(中心度量)

您可以将许多centrality measure算法用作机器学习模型的功能。我将谈谈其中两个。Betweenness Centrality:不仅拥有最多朋友的用户是重要的,将一个地理位置连接到另一个地理位置的用户也很重要,因为这样可以让用户看到来自不同地理位置的内容。Betweenness Centrality量化特定节点在两个其他节点之间的最短选择路径中的次数。Degree Centrality: 它只是节点的连接数。应用Centrality measures可以用作任何机器学习模型中的特征。代码以下是查找子图的Betweenness centrality的代码。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')59d18fd6cf2a98d8de952b948bd44235.png

您可以在此处查看按其betweenness centrality值确定大小的节点。他们可以被认为是信息传递者。打破任何具有高betweenness Centrality的节点将会将图形分成许多部分。

结论

在这篇文章中,我谈到了一些改变了我们生活方式的最有影响力的图算法。随着社交数据的出现,网络分析可以帮助我们改进模型和创造价值。甚至更多地了解这个世界。有很多图算法,但这些是我最喜欢的算法。如果您愿意,请更详细地研究算法。这是带有整个代码的Kaggle Kernel。https://www.kaggle.com/mlwhiz/top-graph-algorithms参考链接:https://towardsdatascience.com/data-scientists-the-five-graph-algorithms-that-you-should-know-30f454fa5513

觉得不错,点个在看呗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

laravel5.6 使用指定字段作为key_MyRocks TTL使用姿势及Bugfix

一些业务场景是经过一段时间后删除过期的数据,MyRocks提供了TTL可以满足该场景。MyRocks 通过Compaction回收过期的数据。本文介绍MyRocks TTL使用姿势以及Bugfix。TTL 通过 table comment 定义,有两种形式:CREATE TABLE t1 (a INT, b INT, c…

mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!

1. 明确需求在设计之初,sys_role表的enabled字段有2个可选值,其中0 代表禁用,1代表启用,而且实体类中我们使用的是Interger类型:/*** 有效标志*/ private Integer enabled;public Integer getEnabled() {return enable…

本地更新github项目_GitHub开源项目2019-03-29更新精选

1.etcd:一个高可用的分布式键值数据库,k8s 全家桶标配的注册与发现服务etcd:一个高可用的分布式键值数据库,k8s 全家桶标配的注册与发现服务。它采用 raft 一致性算法,基于 Go 语言实现。可以通过该项目了解、学习 raf…

maven default aliyun_大家看看大佬对Maven仓库的讲解,有何高明之处?

概念Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地方)。分类maven的仓库只有两大类:1.本地仓库 2.远程仓库,在远程仓库中又分成了3种:中央仓库、 私服…

计算差分方程的收敛点_数值计算(五十九)热传导方程组的差分数值求解

1 问题描述Chenglin Li:数值计算(三)matlab求解一般的偏微分方程组​zhuanlan.zhihu.com因为给出的边界条件包含导数,因此需要同时考虑前向差分和后向差分;遍历循环,先计算每个坐标的时间节点,或…

python树莓派编程_python树莓派编程

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!例如,你可以用树莓派搭建你自己的家用云存储服务器。? 树莓派用python来进行编程。 树莓派项目的…

se是什么职位_女皇大学PSE&SE 独家解析!

坐落于圣劳伦斯河畔的女皇大学成立于1841年,至今已经有178年的历史了。作为加拿大传统的四大名校“Old Four”之一,女王大学一直以来在学术成就(常年位列麦考林排名医博类前5),学生满意度(麦考林排名医博类…

js中new操作符

1.什么是new? 在JS中,new的作用是通过构造函数来创建一个实例对象(和普通函数不一样,当函数用作构造函数时,首字母一般要大写) function Foo(name) {this.name name; } console.log("new Foo(mm)的类型&#…

charles 安装 ssl_「从零开始Python爬虫」1.7.1 Charles的安装与配置

Charles的安装Charles是一个网络抓包工具,相比Fiddler,其功能更为强大,而且跨平台支持得更好,所以这里选用它来作为主要的移动端抓包工具。相关链接官方网站:https://www.charlesproxy.com下载链接:https:/…

一个div 上下两行_web前端工程师如何理解 CSS 布局和块级格式化上下文

CSS是web前端中的重要内容,很多初学者在学习CSS时都会遇到各种各样的问题,今天就给大家分享web前端开发如何理解CSS不惧和块级格式化上下文。也许你从未听说过这个术语,但是如果你曾经用 CSS 做过布局,那么你也许知道它是什么。理…

html转word 图片丢失 java_Java 设置 Word 文档中图片文字环绕方式

在Word文档中插入图片时,选择合理的图片文字环绕方式可以使图片的展示效果更好,也能使页面的排版更加美观。本文就将介绍如何使用Free Spire.Doc for Java 添加图片到Word文档并设置图片的大小及文字环绕方式。Jar包导入方法一:下载Free Spir…

c语言getchar_二级C语言试题刷题录

2020.9 计算机二级C语言科目选择题标黑的为正确选项程序流程图中带有箭头的线段表示的是控制流 图元关系、数据流、调用关系当图为数据流图的时候,标有名字的箭头表示数据流结构化程序设计的基本原则不包括多态性 自顶向下、模块化、逐步求精软件设计中模块划分应遵…

Git各指令的本质

前言 作为当前世界上最强大的代码管理工具Git相信大家都很熟悉,但据我所知有很大一批人停留在clone、commit、pull、push...的阶段,是不是对rebase心里没底只敢用merge?碰见版本回退就抓瞎?别问我怎么知道的,问就是&a…

python re模块详解_python 详解re模块

本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 注意:本文基于Python2.4完成&#xf…

cass或cad里提取点坐标及高程的插件_一个坐标计算小程序 EXCEL 可以进行抵偿任意带高斯坐标转换...

永久下载:https://www.celiang.net/article/688【1】史上最齐全的CAD下载资源!!!【2】【BIM软件】Revit 2018软件安装包免费送,内附安装教程!【3】南方CASS展点方法视频教程【4】坐标转换中的七参数详谈&am…

exe解包和重新打包_Jira 批量提交问题 + 生成可执行文件exe

本地环境 Python 3.7.1 windows 10 x64一 jira 批量提交1 脚本思路(1) 待提交问题存储:csv (习惯用 csv ,其他如excel 理论上也可以)(2) 使用 jira 库的方法 create_issue(3) 已提交问题存储到另一个 csv 文件里(用于后续操作,如统一更新状态…

matlab基于dct的图像压缩编码解码_音频压缩编码的基本原理详解

1.视频编码基本原理(1) 视频信号的冗余信息以记录数字视频的YUV分量格式为例,YUV分别代表亮度与两个色差信号。例如对于现有的PAL制电视系统,其亮度信号采样频率为13.5MHz;色度信号的频带通常为亮度信号的一半或更少&a…

linux 查看登入记录_无时无刻,用 SimplyBook.me 管理者 App 查看客户预约排程!

经过数日优化及调整,SimplyBook.me 日前推出了管理者专用 App,有别于过往在手机装置中,透过网页查询预约资讯,现在经营者也能到 App Store 或是 Google Play 下载专属应用程式(App),无时无刻管理…

python组成结构_Python数据分析丨pandas基本数据结构组成

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:统计学家 目录 1引言 2 Series数组 2.1 Series数组构成 2.2 创建Series数组 2.3 Series数组常用属性 3…