六十四卦的概率分布:用统计方法重构卦象发生频率
六十四卦的概率分布:用统计方法重构卦象发生频率
一、见证奇迹的时刻:六十四卦是均匀分布吗
《易经》六十四卦由六爻组成,每爻有阴阳两种可能,排列组合共计 2⁶ = 64 种。如果每爻独立且阴阳等概率出现,六十四卦应服从均匀分布,每卦出现概率为 1/64 ≈ 1.56%。
但实际卜卦过程并非简单随机抽样。传统卜卦方法(如大衍筮法、金钱卦)的起卦过程存在结构性偏差。大衍筮法中,经过"分二、挂一、揲四、归奇"四步操作后,结果并非完全均匀。金钱卦中三枚铜钱掷出老阳(三个正面)的概率为 1/8,而少阴(一个正面两个反面)的概率为 3/8。这意味着各爻的"动爻"(老阳、老阴)与"静爻"(少阳、少阴)概率并不相等。
如果各爻状态的概率不同,六十四卦的分布就不再是均匀的。某些卦象会显著更频繁地出现,而另一些则极为罕见。这个事实对于将卦象分析应用于机器学习建模至关重要——概率分布直接影响模型训练时的类别平衡和损失函数设计。
从统计角度看,这种非均匀不是方法缺陷,而是起卦过程的结构特征。理解并量化这个特征,比假设均匀分布更有分析价值。
二、从起卦过程到概率分布:蒙特卡洛模拟验证
flowchart TD A[起卦方法选择] --> B{大衍筮法} A --> C{金钱卦法} B --> B1[分二: 49根蓍草随机分两堆] B1 --> B2[挂一: 取一根挂起] B2 --> B3[揲四: 每四根为一组计数] B3 --> B4[归奇: 剩余蓍草归拢] B4 --> B5[三变定一爻] B5 --> B6{爻的概率分布} C --> C1[三枚铜钱掷六次] C1 --> C2[每次结果: 4种可能] C2 --> C3{爻的概率分布} B6 --> D[老阳概率 ≈ 3/16] B6 --> E[少阴概率 ≈ 7/16] B6 --> F[少阳概率 ≈ 5/16] B6 --> G[老阴概率 ≈ 1/16] C3 --> C31[老阳: 1/8] C3 --> C32[少阴: 3/8] C3 --> C33[少阳: 3/8] C3 --> C34[老阴: 1/8] D --> H[六十四卦概率分布] E --> H F --> H G --> H C31 --> H C32 --> H C33 --> H C34 --> H H --> I[非均匀分布] I --> J{统计特征} J --> K[高频卦象 TOP 10] J --> L[低频卦象 BOTTOM 10] J --> M[集中度指标 Gini 系数] style I fill:#ff9800,color:#fff style K fill:#1565c0,color:#fff style L fill:#c62828,color:#fff关键发现:
- 金钱卦法中,每种爻的概率分布存在差异(老阳 ≠ 老阴的概率),导致不同卦象的出现频率不同;
- 大衍筮法中,老阳、少阴、少阳、老阴的比例约为 3:7:5:1,非等概率分布;
- 两种起卦方法得到的六十四卦分布曲线形状相似但峰值位置不同。
三、蒙特卡洛模拟:用代码验证直觉猜想
import numpy as np from collections import Counter import matplotlib.pyplot as plt def simulate_coin_divination(num_trials: int = 100000): """ 金钱卦法蒙特卡洛模拟 设计原因:每次模拟独立生成六爻,统计所有卦象的出现频率 不做任何作弊或人为干预,纯随机模拟 """ # 设计原因:三枚铜钱的结果概率 # 3正(老阳): 1/8, 2正1反(少阴): 3/8, 1正2反(少阳): 3/8, 3反(老阴): 1/8 coin_probs = [1/8, 3/8, 3/8, 1/8] line_types = ['老阳', '少阴', '少阳', '老阴'] # 设计原因:用字典而非 list 存储卦象计数 # 六十四卦的编号作为 key,方便后续按概率排序和分析分布 hexagram_counts = Counter() for _ in range(num_trials): # 设计原因:一次生成六爻,每爻独立抽取 # 从下往上排列(初爻→上爻),对应卦象的二进制编码 lines = np.random.choice(line_types, size=6, p=coin_probs) # 设计原因:将爻类型转为阴阳(老阳和少阳为阳爻,少阴和老阴为阴爻) # 六位二进制码即为卦象的唯一标识 binary = ''.join(['1' if l in ['老阳', '少阳'] else '0' for l in lines]) hexagram_id = int(binary, 2) hexagram_counts[hexagram_id] += 1 return hexagram_counts def analyze_distribution(counts: Counter): """ 分析卦象分布特征 设计原因:使用多种统计指标而非单一指标 不同指标反映分布的不同侧面——均值、方差、Gini 各有侧重 """ values = np.array(list(counts.values())) probs = values / values.sum() stats = { 'total_trials': values.sum(), 'mean': values.mean(), 'std': values.std(), 'min_prob': probs.min(), 'max_prob': probs.max(), 'max_min_ratio': probs.max() / probs.min(), # 设计原因:Gini 系数衡量分布的不均匀程度 # 0 = 完全均匀,1 = 完全不均匀(所有概率集中在一个类别) 'gini': 1 - np.sum((np.sort(probs).cumsum() / probs.sum()) ** 2) * 2 / len(probs), # 设计原因:如果完全均匀,每个概率 = 1/64 ≈ 0.015625 # 卡方值反映偏离均匀分布的程度 'chi2': np.sum((values - values.mean())**2 / values.mean()), } # 设计原因:输出概率最高和最低的 5 个卦象 # 帮助理解哪些卦象是"常见"的,哪些是"罕见"的 sorted_items = sorted(counts.items(), key=lambda x: x[1], reverse=True) stats['top5'] = [(f'卦{hex(k):02d}', v/stats['total_trials']*100) for k, v in sorted_items[:5]] stats['bottom5'] = [(f'卦{hex(k):02d}', v/stats['total_trials']*100) for k, v in sorted_items[-5:]] return stats # 执行模拟 counts = simulate_coin_divination(100000) stats = analyze_distribution(counts) print(f"Gini 系数: {stats['gini']:.4f}") print(f"最大/最小概率比: {stats['max_min_ratio']:.2f}x") print(f"卡方统计量: {stats['chi2']:.2f}")四、统计规律的边界:概率不等于必然
需要明确几个重要边界:
模拟假设 vs 现实偏差:上述模拟假设每次掷硬币的结果完全独立且概率固定。但在实际卜卦中,操作者的手法习惯、铜钱的质量不均匀、掷币力度等因素会引入系统性偏差。这些偏差可能导致实际分布进一步偏离理论分布。
概率解读的陷阱:卦象 X 的概率是 Y 的 2 倍,不意味着"卦象 X 更准确"或"更常见"。概率只反映起卦过程的随机性特征,与卦象本身的义理无关。
机器学习建模的启示:
- 如果使用卦象作为分类标签训练模型,需要处理类别不平衡问题(使用加权损失函数或重采样);
- 六十四卦不是 64 个独立类别——它们之间存在相似性(如互卦、综卦关系),可以用层次化标签或对比学习来建模;
- 起卦过程的结构性偏差本身就是有价值的信息,不应简单地当作噪声排除。
五、总结
六十四卦在传统起卦过程中并非均匀分布。金钱卦法和大衍筮法中,各爻状态的概率不等,导致卦象的出现频率存在结构性差异。蒙特卡洛模拟可以量化这种非均匀分布的程度,Gini 系数和卡方统计量是衡量偏离均匀分布的有效指标。概率分布的不均匀性对基于卦象的机器学习建模产生直接影响——需要处理类别不平衡和卦象之间的结构关联。同时需注意,模拟假设的理想条件与现实卜卦过程存在差异,概率分析不替代卦象本身的义理解读。