图论基础:从零开始理解图结构

大家好,我是你们的老朋友。今天咱们来聊聊图论基础——别被名字吓到,其实这东西特别接地气。我刚开始接触图神经网络时,第一反应也是「这玩意儿跟基金持仓有啥关系?」后来才发现,图就是描述「谁和谁有关系」的最自然方式。

你想想看,基金持仓分析里,基金和股票之间是什么关系?不就是「持有」关系嘛。一只基金持有多只股票,一只股票被多只基金持有——这不就是一张天然的图吗?

图的定义:说白了就是节点加边

图是什么?我习惯用一个简单公式来记:图 = 节点 + 边。节点代表实体,边代表关系。

在数学上,图定义为 G = (V, E),其中 V 是节点集合,E 是边集合。举个例子:

  • V = {基金A, 基金B, 股票1, 股票2, 股票3}
  • E = {(基金A, 股票1), (基金A, 股票2), (基金B, 股票2), (基金B, 股票3)}

这就构成了一个简单的基金-股票持仓图。我在做持仓分析项目时,第一步就是把数据整理成这种格式——节点列表和边列表。这一步看似简单,但数据清洗经常让人头疼,比如股票代码格式不统一、基金名称有空格等等。

核心要点:图的核心就是「关系」。没有关系,图就不存在。你想想看,如果基金和股票之间没有持仓关系,那分析个啥?

节点与边:图的基本元素

节点(Node)也叫顶点(Vertex),边(Edge)也叫链接(Link)。这两个概念搞清楚了,图论就入门了一半。

节点可以带属性。比如基金节点可以有「基金规模」「成立日期」「基金经理」等属性;股票节点可以有「行业」「市值」「市盈率」等属性。这些属性在图神经网络中会被用来做特征学习。

也可以带属性。比如持仓比例就是边的属性——基金A持有股票1的比例是5%,这个5%就是边上的权重。我在实际项目中,经常把持仓比例归一化到0-1之间,这样模型训练更稳定。

我的小技巧:处理大规模图数据时,建议用整数ID代替字符串名称作为节点标识。比如把「易方达蓝筹精选」映射成ID 1001,把「贵州茅台」映射成ID 2001。这样内存占用小,计算速度快。

有向图与无向图:关系是有方向的

这里有个关键区别:关系有没有方向?

无向图:边没有方向,表示「双向关系」。比如「朋友关系」——A是B的朋友,B也是A的朋友。在基金持仓场景中,如果我们只关心「是否有关联」,可以用无向图。

有向图:边有方向,表示「单向关系」。比如「持有关系」——基金A持有股票1,但股票1并不持有基金A。所以基金持仓图天然就是有向图。

我记得有一次,团队里新来的同事把持仓图建成了无向图,结果模型训练出来效果很差。排查了半天才发现问题——方向搞反了。嗯,这里要注意:方向错了,整个分析逻辑就变了

还有一种情况是双向图,其实就是两个方向都有边的有向图。比如基金A和基金B共同持有了某只股票,我们可以认为它们之间存在「共同持仓」关系,这个关系可以是双向的。

避坑指南:我曾经在构建基金-股票二分图时,不小心把边方向搞反了,导致后续的图卷积操作完全失效。建议在代码里显式标注边的方向,比如用 (source, target) 元组表示,source是基金,target是股票。

图的矩阵表示:让计算机理解图

图在数学上可以用矩阵表示,这样计算机就能处理了。常用的有三种矩阵:邻接矩阵、度矩阵和拉普拉斯矩阵。今天先讲前两个。

邻接矩阵

邻接矩阵 A 是一个 N×N 的方阵,N 是节点数量。如果节点 i 和节点 j 之间有边,则 A[i][j] = 1(无权图)或权重值(有权图);否则为 0。

举个例子,假设有3个节点:基金A、股票1、股票2。持仓关系如下:

  • 基金A → 股票1(持仓比例 5%)
  • 基金A → 股票2(持仓比例 3%)

邻接矩阵(有向、有权)就是:

        基金A  股票1  股票2
基金A     0     0.05   0.03
股票1     0      0      0
股票2     0      0      0

注意:有向图的邻接矩阵不对称。如果改成无向图,矩阵会变成对称的。

实际应用:在Python里,我常用scipy.sparse的csr_matrix来存储邻接矩阵。因为基金持仓图通常很稀疏——一只基金只持有几十只股票,但全市场有几千只股票。用稀疏矩阵能省下大量内存。

度矩阵

度矩阵 D 是一个对角矩阵,对角线上的元素 D[i][i] 表示节点 i 的度。

对于无向图,度就是与该节点相连的边的数量。对于有向图,分为:

  • 出度:从该节点出发的边数
  • 入度:指向该节点的边数

还是上面那个例子:

  • 基金A的出度 = 2(持有两只股票)
  • 股票1的入度 = 1(被一只基金持有)
  • 股票2的入度 = 1

度矩阵(出度)就是:

        基金A  股票1  股票2
基金A     2      0      0
股票1     0      0      0
股票2     0      0      0

我的经验:度矩阵在GCN(图卷积网络)中特别重要。归一化时,我们会用 D^(-1/2) * A * D^(-1/2) 这种形式,目的是让不同度的节点有可比性。否则,高连接度的基金(比如持有很多股票)会主导整个计算过程。

知识体系总览

下面这张图总结了本章的核心内容,我习惯用SVG画这种结构图,清晰直观:

图论基础知识体系 图 (Graph) 定义:G = (V, E) 节点(实体)+ 边(关系) 有向图 vs 无向图(方向决定关系语义) 矩阵表示:邻接矩阵 | 度矩阵 | 拉普拉斯矩阵 核心 元素 分类 计算

这张图把本章的知识点串起来了。从图的定义出发,到节点和边这两个基本元素,再到有向图和无向图的分类,最后落到矩阵表示——这是计算机处理图的基础。每一步都是环环相扣的。

好了,图论基础就讲到这里。记住一句话:图就是关系的数学化表达。在基金持仓分析中,你看到的每一只基金、每一只股票,以及它们之间的持仓关系,都可以用图来建模。掌握了这个思维,后面的图神经网络就好理解了。

课后思考:如果你要构建一个「基金-基金经理-股票」的三层图,节点和边分别应该怎么设计?试试看,这能帮你巩固今天学的知识。


公众号:蓝海资料掘金营,微信deep3321