选自towardsdatascience
作者: Maël Fabien 机器之心编译 参与:熊猫本文是其中第二篇,介绍了图算法。更多文章和对应代码可访问: https://github.com/maelfabien/Machine_Learning_Tutorials 本文涵盖以下主题:图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构、检测欺诈、理解汽车租赁服务的消费者行为或进行实时推荐。近日,数据科学家 Maël Fabien 在其博客上发布了涉及图论、图算法和图学习的系列文章《图论与图学习》。
主要的图算法
示意图和用例
Python 示例
import numpy as np
import random
import networkx as nx
from IPython.display import Image
import matplotlib.pyplot as plt
后文会使用 networkx 最新的 2.0 版本。networkx 是一个用于复杂网络的结构、动态和功能的创建、操作和研究的 Python 软件包。 我会尽量以实用为目标,努力阐释每个概念。 前一篇文章介绍了图的主要种类以及描述一个图的基本特性。现在我们更加详细地介绍图分析/算法以及分析图的不同方式。 为了理解上下文,这里给出一些图算法的用例:
实时欺诈检测
实时推荐
精简法规遵从性
复杂网络的管理和监控
身份和访问管理
社交应用/功能
…
Pathfinding(寻路):根据可用性和质量等条件确定最优路径。我们也将搜索算法包含在这一类别中。这可用于确定最快路由或流量路由。
Centrality(中心性):确定网络中节点的重要性。这可用于识别社交网络中有影响力的人或识别网络中潜在的攻击目标。
Community detection(社群检测):评估群体聚类的方式。这可用于划分客户或检测欺诈等。
寻路算法是通过最小化跳(hop)的数量来寻找两个节点之间的最短路径。
搜索算法不是给出最短路径,而是根据图的相邻情况或深度来探索图。这可用于信息检索。
宽度优先搜索(BFS):首先探索每个节点的相邻节点,然后探索相邻节点的相邻节点……
深度优先搜索(DFS):会尝试尽可能地深入一条路径,如有可能便访问新的相邻节点。
最短路径计算的是一对节点之间的最短的加权(如果图有加权的话)路径。这可用于确定最优的驾驶方向或社交网络上两个人之间的分离程度。 计算图中的最短路径的方法有很多,包括 Dijkstra 算法,这是 networkx 中的默认算法。 根据维基百科,该算法的伪代码如下:
将图中所有节点标记为未访问。创建一个所有未访问节点的集合,称为未访问集。
为每个节点分配一个暂定的距离值:将我们的初始节点的该值设置为零,将其它所有节点的该值设置为无穷。将初始起始节点设置为当前节点。
对于当前节点,考察其所有未被访问过的相邻节点并计算通过当前节点的暂定距离。比较新计算出的暂定距离与当前分配的值,配之以其中更小的值。举个例子,如果当前节点 A 标记的距离为 6,将其与相邻节点 B 连接的边的长度为 2,则通过 A 到达 B 的距离为 6+2=8。如果 B 之前被标记的距离大于 8,则将其改为 8。否则,保持其当前的值。
当我们考察完当前节点的所有未访问节点时,将当前节点标记为已访问,并将其移出未访问集。已访问节点不会再次进行检查。
如果目标节点已被标记为已访问(当规划两个特定节点之间的路由时)或未访问集中节点之间的最小暂定距离为无穷时(当规划一次完整的遍历时;当初始节点与剩余的未访问节点之间没有连接时才会出现这种情况),那么就停止操作。算法结束。
否则,选择标记有最小暂定距离的未访问节点,将其设置为新的「当前节点」,然后回到步骤 3。
# Returns shortest path between each node