图论基础:图的定义与表示
各位同学,欢迎来到第二章。说实话,图论这东西,我当年在学校学的时候觉得挺枯燥的。直到后来做量化因子挖掘,发现股票之间的关联、产业链的传导,本质上都是图结构。嗯,今天我们就把它彻底搞明白。
图的定义:节点与边
图是什么?说白了,就是一堆「东西」和它们之间的「关系」。
- 节点(Node/Vertex):就是那个「东西」。在金融里,节点可以是一只股票、一家公司、一个行业。
- 边(Edge):就是「关系」。比如A公司是B公司的供应商,或者C股票和D股票属于同一个板块。
我习惯用数学语言来记:G = (V, E)。V是节点集合,E是边的集合。就这么简单。
核心理解:图就是「实体+关系」的抽象。你想想看,任何能描述成「谁和谁有关系」的问题,都可以用图来建模。
图的表示:邻接矩阵
计算机怎么存图?最直观的方式就是邻接矩阵。
假设有N个节点,我们就用一个N×N的矩阵。如果节点i和节点j之间有边,矩阵的(i,j)位置就填1,否则填0。
# 一个简单的邻接矩阵示例
# 3个节点:A, B, C
# 边:A-B, B-C
adj_matrix = [
[0, 1, 0], # A 连接 B
[1, 0, 1], # B 连接 A 和 C
[0, 1, 0] # C 连接 B
]
我在项目中遇到过一个问题:当节点数量达到几千甚至上万时,邻接矩阵会变得非常稀疏。大部分位置都是0,存储效率极低。这时候就需要用稀疏矩阵或者邻接表了。
我的建议:小规模数据(节点数<1000)用邻接矩阵,直观好调试。大规模数据用稀疏格式,省内存。
图的类型
图不是只有一种。根据边的性质,我们可以分成几类。我当年做产业链分析时,每种类型都踩过坑。
无向图 vs 有向图
- 无向图:边没有方向。比如「A和B是竞争对手」,关系是对称的。
- 有向图:边有方向。比如「A公司投资了B公司」,方向很重要。
为什么会这样?因为金融里的关系很多是单向的。资金流向、股权结构、供应链上下游,都是有方向的。我曾经用无向图去分析供应链,结果发现上下游关系全乱了。嗯,从那以后我每次建模前都会先问自己:这个关系有方向吗?
加权图
有时候光知道「有关系」还不够,还得知道「关系有多强」。这就是加权图。
边的权重可以表示很多东西:
- 两家公司的交易金额
- 股票之间的相关系数
- 行业之间的影响强度
避坑指南:我曾经在构建行业关联图时,直接用相关系数作为权重。结果发现很多弱相关也被当成强关联,图变得非常稠密。后来我加了一个阈值过滤,只保留相关性大于0.6的边,效果好了很多。
Python图数据处理库:NetworkX入门
好了,理论说完了,我们来点实际的。Python里处理图,我最常用的就是NetworkX。它简单、直观,而且功能强大。
安装与导入
pip install networkx
import networkx as nx
import matplotlib.pyplot as plt
创建图
# 创建无向图
G = nx.Graph()
# 添加节点
G.add_node('贵州茅台')
G.add_node('五粮液')
G.add_node('泸州老窖')
# 添加边
G.add_edge('贵州茅台', '五粮液')
G.add_edge('贵州茅台', '泸州老窖')
# 查看图信息
print(G.nodes()) # 节点列表
print(G.edges()) # 边列表
有向图与加权图
# 有向图
DG = nx.DiGraph()
DG.add_edge('母公司A', '子公司B') # 方向:A -> B
# 加权图
WG = nx.Graph()
WG.add_edge('股票X', '股票Y', weight=0.85) # 相关系数作为权重
可视化
# 简单画图
nx.draw(G, with_labels=True, node_color='lightblue',
node_size=500, font_size=10)
plt.show()
我的习惯:在正式分析前,我一定会先画图看看。视觉上能发现很多数据里看不出的问题,比如孤立节点、异常连接等。
本章知识体系
下面这张图总结了本章的核心内容,我把它画成了SVG,方便你对照理解。
小结
这一章我们讲了图的三个核心要素:定义、表示、类型。说白了就是三件事:
- 图由节点和边组成
- 邻接矩阵是最直观的存储方式
- 有向/无向/加权,选哪种取决于你的业务场景
NetworkX是个好工具,我建议你多动手试试。把几只股票的关系画出来,看看能不能发现点什么。下一章我们会深入图神经网络的核心概念,到时候这些基础就派上用场了。
一句话总结:图就是关系的数学表达。你理解了关系,就理解了图。
公众号:蓝海资料掘金营,微信deep3321