用图神经网络的视角理解五行:一个形式化框架
声明:这是符号系统的形式化建模,不是可验证的生理因果模型。
起源
假设某人是戊土日干,八字里水多土弱。传统命理说”火生土”,多接触火可以增强土的力量。这听起来像是玄学,但背后的”相生相克”逻辑其实可以用图论和消息传递来形式化。
本文把传统八字命理映射到一个 5 节点有向图,用类似 GNN 的消息传递机制,展示”加火是否真的能让土更稳”。
注:以下八字为虚构示例,仅用于演示建模方法。
A. 数学模型
A1. 从四柱到 5×4 分布矩阵
四柱(年/月/日/时)的 8 个位置映射到五行 [木, 火, 土, 金, 水]。
以 癸酉 / 壬子 / 戊寅 / 癸亥 为例:
| 柱 | 天干 | 地支 | 五行分布 |
|---|---|---|---|
| 年 | 癸(水) | 酉(金) | 水1, 金1 |
| 月 | 壬(水) | 子(水) | 水2 |
| 日 | 戊(土) | 寅(木) | 土1, 木1 |
| 时 | 癸(水) | 亥(水) | 水2 |
构建分布矩阵 :
行顺序:[木, 火, 土, 金, 水],列顺序:[年, 月, 日, 时]。
引入层级权重 ,例如强调月柱:
汇总得到五行强度向量:
日干是戊土,因此主节点 。
A2. 相生与相克的邻接矩阵
相生(行生列):木 → 火 → 土 → 金 → 水 → 木
相克(行克列):木 → 土, 土 → 水, 水 → 火, 火 → 金, 金 → 木
A3. 消息传播更新
类似 GNN 的消息传递:相生加分,相克减分。
取 ,初始 。
A4. 干预实验:do(火 += δ)
定义外源火输入 :
一步传播后的闭式解:
关键是土节点:
含义:加一点火,土在一步传播后线性回升——这是”火生土”的结构效应。斜率 0.5 表示每增加 1 单位火,土增加 0.5 单位。
A5. 稳定化处理
纯线性循环图容易振荡。加两个简单的稳定化:
阻尼衰减:
非负截断(ReLU):
B. 实验代码
import numpy as np
import matplotlib.pyplot as plt
# Order: [Wood, Fire, Earth, Metal, Water]
WOOD, FIRE, EARTH, METAL, WATER = range(5)
def build_example_X():
X = np.zeros((5, 4), dtype=float)
# Year: 癸酉 = Water + Metal
X[WATER, 0] += 1
X[METAL, 0] += 1
# Month: 壬子 = Water + Water
X[WATER, 1] += 2
# Day: 戊寅 = Earth + Wood
X[EARTH, 2] += 1
X[WOOD, 2] += 1
# Hour: 癸亥 = Water + Water
X[WATER, 3] += 2
return X
def build_graph_matrices():
A_gen = np.zeros((5, 5), dtype=float)
A_gen[WOOD, FIRE] = 1
A_gen[FIRE, EARTH] = 1
A_gen[EARTH, METAL] = 1
A_gen[METAL, WATER] = 1
A_gen[WATER, WOOD] = 1
A_ctl = np.zeros((5, 5), dtype=float)
A_ctl[WOOD, EARTH] = 1
A_ctl[EARTH, WATER] = 1
A_ctl[WATER, FIRE] = 1
A_ctl[FIRE, METAL] = 1
A_ctl[METAL, WOOD] = 1
return A_gen, A_ctl
def step(h, A_gen, A_ctl, lam_g=0.5, lam_c=0.5, rho=0.5, relu=True):
msg = h + lam_g * (A_gen.T @ h) - lam_c * (A_ctl.T @ h)
h_next = (1 - rho) * h + rho * msg
if relu:
h_next = np.maximum(h_next, 0.0)
return h_next
def rollout(h0, A_gen, A_ctl, T=20, **kwargs):
hs = [h0.copy()]
h = h0.copy()
for _ in range(T):
h = step(h, A_gen, A_ctl, **kwargs)
hs.append(h.copy())
return np.array(hs)
# Build X and s
X = build_example_X()
w = np.array([1, 2, 1, 1], dtype=float)
s = X @ w
# Build graph matrices
A_gen, A_ctl = build_graph_matrices()
# Intervention: do(Fire += delta)
def intervene_fire(s, delta):
h0 = s.copy()
h0[FIRE] += float(delta)
return h0
# Compare trajectories
deltas = [0, 1, 2, 4]
T = 25
trajectories = {}
for d in deltas:
h0 = intervene_fire(s, d)
hs = rollout(h0, A_gen, A_ctl, T=T, lam_g=0.5, lam_c=0.5, rho=0.4, relu=True)
trajectories[d] = hs
# Plot Earth node over time
plt.figure()
for d, hs in trajectories.items():
plt.plot(hs[:, EARTH], label=f"delta={d}")
plt.xlabel("Iteration t")
plt.ylabel("Earth node value")
plt.title("do(Fire += delta): Earth over iterations")
plt.legend()
plt.savefig("earth_trajectory.png", dpi=150)
plt.show()C. 实验结果
图 1:土节点随迭代的变化

- δ=0(无干预):土先下降后缓慢回升
- δ 越大,土恢复越快,后期增长越陡
- 初始下降是因为木克土、水克火的连锁效应
图 2:一步响应 vs δ

- 完美线性关系,与闭式解 吻合
- 验证了”火生土”在这个形式化框架中的结构效应
D. 换表示(换基/重编码) + 压缩
这个模型最有意思的地方,不是数学本身,而是背后的表示变换。
时间周期空间
理论上,四柱每柱有 10 天干 × 12 地支 = 120 种:
但实际有约束:
- 干支配对规则:阳干配阳支、阴干配阴支 → 每柱只有 60 种组合(六十甲子)
- 月干由年干决定:知道年干就知道月干,月柱自由度只有 12(月支)
- 时干由日干决定:知道日干就知道时干,时柱自由度只有 12(时支)
所以实际有效组合:
从 2 亿到 52 万,约束砍掉了 99.75%。
同构变换:时间 ↔ 八字
八字编码和时间周期位置是同构的——都是 52 万种可能,不损失信息。
那编码在干嘛?引入语义层和结构先验:
- 每个符号有五行属性(甲=木,丙=火…)
- 符号之间有相生相克关系
这类似傅立叶变换:
| 傅立叶 | 八字 | |
|---|---|---|
| 变换 | 时域 ↔ 频域 | 时间周期 ↔ 符号 |
| 性质 | 同构,无损 | 同构,无损 |
| 引入 | 正弦/余弦基 | 五行语义 + 图 |
| 压缩 | 截断高频 | 22符号 → 5五行 |
压缩:52 万 → 5
| 步骤 | 操作 | 效果 |
|---|---|---|
| ① 类别归并 | 22 种符号 → 5 种五行 | 语义聚类 |
| ② 权重聚合 | 5×4 矩阵 → 5 维向量 | |
| ③ 结构先验 | 加入固定生克图 | 约束推理空间 |
最终的推理空间:5 维向量 + 一个 5 节点有向图。
框架权
这种结构有一个微妙的权力维度:谁定义抽象框架,谁就定义了什么是”合理解释”。
当框架被用来帮人理解结构时,它是认知工具;当框架被用来垄断解释权时,它就变成权术。
区分在于:框架是否被公开、是否允许质疑、是否可替换。
本文把框架完全暴露出来(矩阵、图、更新规则),这是去权术化的做法——让结构透明,让人获得理解能力,而不是依赖解释者。
E. DS + ADS:两套解释语言
把符号系统数学化之后,我发现了一个有趣的张力。
两种路径
| 叙事解释(ADS) | 结构模型(DS) | |
|---|---|---|
| 语言 | ”高山阳土,水多木旺,土被消耗” | |
| 优点 | 有温度,有整体感,贴近人的经验 | 可计算,可推演,可做干预实验 |
| 缺点 | 不可量化,难做局部因果拆解 | 失去整体故事,冷、抽象、局部 |
一开始用叙事方式理解这个系统:高山的土、很多水、不断生长的树。然后把它压缩成矩阵和图,变成了一个可计算的传播模型。
模型更精确,却也更干巴了。聚焦点变得很小,之前那种大的画面感在模型上讲不出来。
DS + ADS
真正让这件事”有意义”的,不是模型本身,而是能在模型语言和人类经验语言之间来回翻译的那一刻。
- DS(Data Science):变量、结构、可计算
- ADS(Applied Data Storytelling / Analytical Data Sensemaking):意义、直觉、可理解
大多数人停在两个极端:只会讲故事不会建模,或者只会建模不会解释。
真正有力量的,是同时拥有两套语言:一套对变量说话,一套对人说话。
也许数据科学真正落地的地方,不只是 DS,而是 DS + ADS —— 让数据结构重新变回人能理解的世界。
F. 局限与声明
- 这是符号系统的形式化,不是可验证的因果模型
- 权重 是超参数,可以做敏感性分析
- 传统命理有更复杂的规则(十神、大运、流年),本模型只是简化演示
参考
- 消息传递神经网络(MPNN): Gilmer et al., 2017
- 五行生克基础:《子平真诠》《滴天髓》
- 表示学习与归纳偏置:Bengio et al., “Representation Learning: A Review and New Perspectives”, 2013
在线体验
→ 计算人文 Demo — 交互式探索压缩过程与干预实验
→ GitHub Repo — 完整代码
用现代框架解构传统系统