相信大家已经对 Pandas 或 SQL 等其他关系数据库非常熟悉了。我们习惯于将行中的用户视为列。但现实世界的表现真的如此吗?
在互联世界中,用户不能被视为独立实体。他们之间具有一定的关系,在构建机器学习模型时,有时也希望包含这样的关系。
在关系型数据库中,我们无法在不同的行(用户)之间使用这种关系,但在图形数据库中,这样做是相当简单的。在这篇Python学习教程中将为大家介绍一些重要的图算法,以及Python 的代码实现。
1、连通分量
具有三个连通分量的图
将上图中的连通分量算法近似看作一种硬聚类算法,该算法旨在寻找相关数据的簇类。举一个具体的例子:假设拥有连接世界上任意城市的路网数据,我们需要找出世界上所有的大陆,以及它们所包含的城市。我们该如何实现这一目标呢?
基于BFS / DFS的连通分量算法能够达成这一目的,接下来,我们将用 Networkx 实现这一算法。
代码
使用 Python 中的 Networkx 模块来创建和分析图数据库。如下面的示意图所示,图中包含了各个城市和它们之间的距离信息。
示意图
首先创建边的列表,列表中每个元素包含两个城市的名称,以及它们之间的距离。
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’, ‘Mum