用图神经网络的视角理解五行:一个形式化框架

声明:这是符号系统的形式化建模,不是可验证的生理因果模型。

起源

假设某人是戊土日干,八字里水多土弱。传统命理说”火生土”,多接触火可以增强土的力量。这听起来像是玄学,但背后的”相生相克”逻辑其实可以用图论和消息传递来形式化。

本文把传统八字命理映射到一个 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:土节点随迭代的变化

Earth trajectory

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

图 2:一步响应 vs δ

Earth response

  • 完美线性关系,与闭式解 吻合
  • 验证了”火生土”在这个形式化框架中的结构效应

D. 换表示(换基/重编码) + 压缩

这个模型最有意思的地方,不是数学本身,而是背后的表示变换

时间周期空间

理论上,四柱每柱有 10 天干 × 12 地支 = 120 种:

但实际有约束:

  1. 干支配对规则:阳干配阳支、阴干配阴支 → 每柱只有 60 种组合(六十甲子)
  2. 月干由年干决定:知道年干就知道月干,月柱自由度只有 12(月支)
  3. 时干由日干决定:知道日干就知道时干,时柱自由度只有 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. 局限与声明

  1. 这是符号系统的形式化,不是可验证的因果模型
  2. 权重 是超参数,可以做敏感性分析
  3. 传统命理有更复杂的规则(十神、大运、流年),本模型只是简化演示

参考

  • 消息传递神经网络(MPNN): Gilmer et al., 2017
  • 五行生克基础:《子平真诠》《滴天髓》
  • 表示学习与归纳偏置:Bengio et al., “Representation Learning: A Review and New Perspectives”, 2013

在线体验

计算人文 Demo — 交互式探索压缩过程与干预实验

GitHub Repo — 完整代码

用现代框架解构传统系统