几年前,我疯狂地阅读《权力的游戏》系列丛书,发现自己很难记住所有角色。(这并不奇怪——该系列中有超过 150 个有名字的角色!)我不断地在各个章节之间来回浏览,或者不断地查阅《冰与火之歌》维基百科来记住情节。我需要一张思维导图——肯定有更好的方法来形象化这些角色吧?
下图是维基百科的一个示例网络图,展示了维基百科编辑对不同语言的贡献。通过这个例子,我们可以了解一些图论概念的基础知识(或者,如果你已经熟悉的话,可以快速复习一下):
圆圈代表文章所用的语言,是图的“顶点”(可互换称为“节点”)。
“边”是连接每对顶点的线。图中的每条边都是通过将一对顶点映射到一条边的关联函数确定的。
在这个例子中,每条边(通过线宽或厚度)表示为该线连接的两种语言做出贡献的编辑者数量。这就是我们所说的无向简单图。“无向”表示 {en--> fr} 和 {fr --> en} 相同,“简单”表示每对顶点之间只有一条边连接。该图也是“加权的”,这意味着边的厚度与顶点之间的关系强度有关。在这个例子中,加权关联函数可能看起来像这样:
虽然以这种方式对图形进行可视化表示是一种直观的方法,可以快速显示关系以便于理解,但将数据集表示为图形对象可以让我们获得更丰富的见解。
“在数据科学中,80% 的时间都花在准备数据上,20% 的时间都花在抱怨需要准备数据上。”
数据科学家可能不会在所有事情上达成一致——但我们一致认为,任何项目中最困难的部分是获取数据。幸运的是,这篇文章已经解决了这一问题。Kaggle 上有一个干净的汉密尔顿歌词数据集,您可以轻松下载并开始绘制图表。
这就是汉密尔顿数据集的样子。
每个角色/歌曲/歌词都有一行记录。
为了构建所有汉密尔顿发言人的网络图,必须定义以下内容:
节点(发言者名单)
边缘(连接每对扬声器)
关联函数将每对顶点映射到一条边(带有可选权重)
我选择的关联函数是每对说话者一起出现的歌曲数量。我的假设是两个角色一起出现的歌曲越多,他们的关系就越强。
Weight {speaker,x, speaker,y} = #songs that feature both speaker,x and speaker,y
使用 R 的 dplyr,我可以将原始数据集转换为**{src, dest, weight}**
实体,然后将其转换为邻接矩阵。然后我可以使用R 的 igraph 包中的 graph.adjacency 从此邻接矩阵创建一个“图形对象”,然后我可以将其用于绘图和其他分析。
可以使用plot.igraph函数可视化 graph_obj。由于此函数有许多自定义布局可供选择,因此我首先使用“星型”布局渲染同一张图。
从技术上讲,结果是一个网络图。但有可能做得更好吗?上面的图表似乎表明所有顶点和边都具有同等重要性——但这破坏了可视化社交网络的整个意义。有些角色确实更“重要”,有些说话者与其他人的关系更密切。
该图表如何反映这一点?
这就是边权重和顶点度发挥作用的地方。我首先尝试使用plot.igraph
函数的参数,使edge.width
(即图中边的粗细)与权重相关,使vertex.label.cex
(即顶点的字体大小)与度相关。
好多了!等级越高的角色在视觉上就越大,而且从线条的深浅也可以看出强弱关系之间的区别。这种迭代更加直观,让观众可以立即掌握角色之间的关系。考虑到乔治国王的歌曲总是(非常有趣的)独白,所以他是一个孤独的节点也是很合适的。
您还可以使用 R 中的visNetwork库来制作交互式网络图。该库可以放大和缩小图形的多个部分(对于特别大的图形尤其有用),并且支持 Shiny。
中心性是图论中的一个关键概念,用于识别节点的重要性:
度中心性:这是衡量连接到每个节点的边的数量的指标。
特征中心性:这是衡量一个节点的“连接性”程度、连接共享的链接数等的指标。它识别对整个网络有影响力的节点,而不仅仅是直接连接到网络的节点。
中介中心性:这实际上是给定节点与其他节点之间的距离,以及充当各种网络集群之间的“桥梁”的程度。它是衡量每个顶点对网络其余部分的“影响力”的指标。
我可以使用 igraph 的 degree()、betweenness() 和 eigen_centrality() 函数来获取生成的图的中心性:
在我们的图表中,Aaron Burr 似乎具有最高的中介中心性(“桥梁”),而 Hamilton 具有最高的特征向量中心性(“影响者”)。您可以自行决定。
网络图的商业应用有很多:
社交网站利用网络图来创建相似用户的社区并提供有针对性的推荐。“推荐好友”功能背后的算法的基本实现可能如下所示:“Alice 的十个密友中有九个也是 Bob 的朋友 -> 向 Alice 推荐 Bob 作为潜在朋友。”
绘制从地点 X 到地点 Y 的最短距离的应用程序(例如地图、拼车服务、送货卡车的供应链和物流等)可能会使用“最短路径”算法的变体,在计算机科学中通常称为旅行商问题。
网络理论是自然语言处理 (NLP) 中词汇和语义处理的关键组成部分,而聊天机器人和虚拟助手(如 Alexa、Cortana、Siri,甚至 IBM 的Watson 赢得了 Jeopardy!) ,这是一款远非简单的双关语和文字游戏。
像“六度空间之凯文·贝肯”这样的名人派对游戏就使用了网络图。
在流行病学中,中心性测量可用于识别流行病或“超级传播者”事件的起源。
如果你仔细想想,互联网就是一个由不同网站组成的庞大网络。搜索引擎利用知识图谱测量来返回与特定搜索查询最相关的页面。
尽管网络图很有趣,但值得注意的是,在生产中使用网络图并非没有缺点。例如,它们可能占用大量资源。与任何矩阵运算一样,可扩展性和性能有时会受到影响。还有一个“冷启动”问题——如果您的数据集太稀疏或实体之间没有太多关系,网络图就不是一种有效的解决方案。然而,如果在正确的环境中正确使用,它们对企业来说是有价值的。
代码: https://github.com/iswaryam/hamilton/ •
数据集来源: https://www.kaggle.com/lbalter/hamilton-lyrics#
如果您是一名 Potterhead,请查看我的 GitHub - 我也使用类似的方法绘制了哈利波特的人物图表。