1、Connected Components(连通域)
一张包含3个Connected Components的图
大家应该都知道聚类是如何工作的吧?您可以将非常接近的Connected Components视为一种在相关/连接数据中查找群集/孤岛的硬聚类算法。举一个具体的例子:假设您有关于连接世界上任何两个城市的道路的数据。你的任务是需要找出世界上所有大陆以及它们所包含的城市。你将如何实现这一目标?来想一想吧。我们用于执行此操作的Connected Components算法是基于BFS / DFS的特殊情况。我不会在这里谈论它是如何工作的,但我们将看到如何使用Networkx启动和运行代码。应用从零售角度来看:假设,我们有很多客户使用大量账户。我们可以使用Connected Components算法的一种方法是在我们的数据集中找出不同的家庭。我们可以根据相同的信用卡使用情况、相同的地址或相同的移动电话号码等假定customer id之间的边(路)。一旦我们有了这些连接,我们就可以运行Connected Components算法来创建单独的集群,然后我们可以为其分配一个家庭ID。然后,我们可以使用这些家庭ID,来根据家庭需求提供个性化推荐。我们还可以使用这个家庭ID,通过创建基于家庭的分组功能来推动我们的分类算法。从财务角度来看:另一个用例是使用这些家庭ID捕获欺诈。如果某个帐户过去曾发生过欺诈行为,那么关联帐户很可能也容易受到欺诈。还有更多无限可能的应用,发挥自己的想象力吧。代码我们将使用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', 'Mumbai', 'Delhi'}cc2: {'ALB', 'NY', 'TX'}如您所见,我们能够在数据中找到不同的Components。只需使用边缘和顶点。该算法可以在不同的数据上运行,以满足我上面提到的任何用例。2、Shortest Path(最短路径)
继续上述示例,我们将获得德国的城市及其相应距离的图。您想找到从法兰克福(起始节点)前往慕尼黑的最短距离。我们用来解决这个问题的算法叫做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通道的最短路径。
你已经看到LinkedIn如何显示一级连接,二级连接。幕后发生了什么?
代码
3、Minimum Spanning Tree(最小生成树)
现在我们有另一个问题。我们在水管铺设公司或互联网光纤公司工作。我们需要使用最少量的电线/管道连接我们所拥有的图中的所有城市。我们如何做到这一点?无向图及其右边的MST。应用最小生成树在网络设计中具有直接应用,包括计算机网络,电信网络,运输网络,供水网络和电网(这个算法最初是为它们发明的)
MST用于近似商旅问题
聚类 - 首先构造MST,然后使用群集间距离和群集间距确定用于破坏MST中某些边缘的阈值。
图像分割 - 它用于图像分割,我们首先在图形上构建MST,其中像素是节点,像素之间的距离基于某种相似性度量(颜色,强度等)
正如你所看到的,上面是我们要铺设的电线。
4、Pagerank(网页排名)
这就是长期以来支持谷歌的页面排序算法。它根据输入和输出链接的数量和质量为每个网页分配分数。应用Pagerank可用于我们想要估算任何网络中节点重要性的任何地方。它已被用于使用引文找到最有影响力的论文。
已被谷歌用于页面排名
它可以用来给tweet排序——用户和tweet作为节点。如果用户A跟随用户B创建用户之间的链接,如果用户tweet / retwets一条tweet,则创建用户和tweet之间的链接
推荐引擎
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')您可以在此处查看按其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觉得不错,点个在看呗