加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

PageRank、最小生成树:ML开发者应该了解的五种图算法

发布时间:2019-09-09 16:23:20 所属栏目:建站 来源:佚名
导读:在互联世界中,用户不能被视为独立的实体。他们之间存在一定的关系,我们有时希望在构建机器学习模型时考虑到这些关系。 在关系数据库中,我们无法在不同的行(用户)之间利用这种关系,但在图数据库中,这样做非常简单。 在这篇文章中,我们将讨论一些数
副标题[/!--empirenews.page--]

在互联世界中,用户不能被视为独立的实体。他们之间存在一定的关系,我们有时希望在构建机器学习模型时考虑到这些关系。

在关系数据库中,我们无法在不同的行(用户)之间利用这种关系,但在图数据库中,这样做非常简单。

在这篇文章中,我们将讨论一些数据科学家应该了解的非常重要的图算法,以及如何使用 Python 实现它们。

连接组件

PageRank、最小生成树:ML开发者应该了解的五种图算法

我们都知道聚类的工作机制,你可以将连接组件视为一种在关联/连接数据中查找集群/个体的硬聚类算法。

举个例子:假设你有连接世界上任何两个城市道路的数据。现在你需要找出世界上所有大洲以及它们所包含的城市。

你将如何实现这一目标呢?

我们采用的连接组件算法是基于广度优先搜索算法(Breadth First Search,BFS)/深度优先搜索算法(Depth First Search,DFS)的特殊情况。这里不再展开介绍工作原理,我们只看一下如何使用 Networkx 启动和运行此代码。

应用

从零售角度看:假设我们有很多客户使用大量账户。使用连接组件算法的一种方法是在这个数据集中找出不同的族。

我们可以根据相同的信用卡使用情况、相同地址、相同手机号码来建立某些客户 ID 之间的连接。一旦有这些连接,我们就可以运行连接组件算法为有连接的客户创建单个集群,然后为其分配一个家庭 ID。

然后,我们可以利用这些家庭 ID,根据家庭需求提供个性化推荐。我们还可以利用家庭 ID,通过创建基于家庭的分组功能来推进分类算法。

从金融角度:另一个用例是利用这些家庭 ID 抓捕诈骗犯。如果某个帐户有过被欺诈经历,那么关联帐户很容易再次受到欺诈。

实施的可能性仅仅受到自身想象力的限制。(想象力越丰富,算法的应用越广泛。)

代码

我们将使用 Python 中的 Networkx 模块来创建和分析图。下面以包含城市和城市间距离信息的图为例,实现我们的目的。

PageRank、最小生成树:ML开发者应该了解的五种图算法

带有随机距离的图

首先创建一个带有城市名(边)和距离信息的列表,距离代表边的权重。

  1. 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 创建一个图:

  1. g = nx.Graph() 
  2. for edge in edgelist: 
  3.     g.add_edge(edge[0],edge[1], weight = edge[2]) 

现在我们想从这张图中找出不同的大洲及其城市,这可以使用连接组件算法来实现:

  1. for i, x in enumerate(nx.connected_components(g)): 
  2.     print("cc"+str(i)+":",x) 
  3. ------------------------------------------------------------ 
  4. cc0: {'Frankfurt', 'Kassel', 'Munchen', 'Numberg', 'Erfurt', 'Stuttgart', 'Karlsruhe', 'Wurzburg', 'Mannheim', 'Augsburg'} 
  5. cc1: {'Kolkata', 'Bangalore', 'Mumbai', 'Delhi'} 
  6. cc2: {'ALB', 'NY', 'TX'} 

如你所见,只需要利用顶点和边,我们就能够在数据中找到不同的组件。该算法可以在不同的数据上运行,从而满足上面提到的各种用例。

最短路径

继续使用上述示例,现在我们有德国城市及城市之间距离的图。如何找到从法兰克福(起始节点)到慕尼黑的最短距离?我们用来解决此问题的算法被称为 Dijkstra。用 Dijkstra 自己的话说:

从鹿特丹到格罗宁根旅行的最短路线是什么?这就是最短路径算法,我花了大约 20 分钟设计了它。一天早上,我和我的未婚妻在阿姆斯特丹购物,累了,我们便坐在咖啡馆的露台上喝咖啡,我只想着能否实现最短路径算法,然后我成功了。

正如我所说,这是一个二十分钟的发明。事实上,它发表于 1959 年,现在来看它的可读性也非常高。它之所以如此美妙,其中一个原因就是我没用笔纸就设计了它。后来我才知道,没有笔纸设计的有点之一是你不得不避免所有可避免的复杂问题。最终,令我惊讶的是,这个算法成为我的著名成果之一。

应用

Dijkstra 算法的变体在 Google 地图中有着广泛使用,用于寻找最短路线。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读