用 Level-k 模型量化策略推理深度——从猜数博弈数据中测量参与者的认知层级¶
核心理念¶
Level-k 推理模型是量化人类策略思维深度的框架——不是问「你做得多好」而是「你推理了多远」。这个模型揭示了大多数人在策略互动中只做 1-2 步推理,而非无限步(纳什均衡的要求)。
操作步骤¶
步骤 1:实验设计——选美比赛博弈 (Beauty Contest Game)¶
# 规则:每个参与者选择 0-100 之间的数字
# 获胜者 = 选择最接近「所有人平均值的 2/3」
# p ∈ (0,1) 是乘数,一般为 2/3
import numpy as np
def beauty_contest_payoff(choices, p=2/3):
"""计算每个参与者的得分(越小越好)"""
target = p * np.mean(choices)
payoffs = np.abs(choices - target)
return payoffs
纳什均衡的推导:如果所有人都理性且知道别人也理性 → 无限迭代 → 所有人都选 0。 $$ \text{Level-0: 随机} \rightarrow 50 \xrightarrow{\times p} 33.3 \xrightarrow{\times p} 22.2 \rightarrow \cdots \rightarrow 0 $$
步骤 2:用离散层级法估计单个参与者的推理层级¶
def estimate_level_discrete(choice, p=2/3, L0_choice=50):
"""
离散层级估计——最简方法
Level-0: 随机 → 期望值 L0_choice
Level-k: 认为别人是 Level-(k-1) → 选择 p × (L_{k-1}的期望)
"""
# 计算各层级的理论选择
levels = {0: L0_choice}
for k in range(1, 10):
levels[k] = p * levels[k-1]
# 找到最接近理论值的层级
best_k = 0
best_dist = float('inf')
for k, theory_value in levels.items():
dist = abs(choice - theory_value)
if dist < best_dist:
best_dist = dist
best_k = k
return best_k
# 带容差的层级估计
def estimate_level_tolerance(choice, p=2/3, L0_choice=50, tolerances=None):
"""
带容差的层级估计——允许观察选择在理论值附近的某范围内
容差 = 理论层级值之间的一半距离
"""
if tolerances is None:
# 自动计算容差
levels = {}
current = L0_choice
for k in range(10):
levels[k] = current
current = p * current
tolerances = {}
for k in range(9):
tolerances[k] = (levels[k] - levels[k+1]) / 2
best_k = 0
best_score = float('inf')
for k in range(9):
theory_value = L0_choice * (p ** k)
score = abs(choice - theory_value) / tolerances.get(k, 5)
if score < best_score:
best_score = score
best_k = k
return best_k, best_score # score < 1 表示在容差内
步骤 3:批量估计群体层级分布¶
def batch_level_estimation(df, choice_col='choice', p=2/3, L0_choice=50):
"""批量估计所有参与者的推理层级"""
df = df.copy()
df['estimated_level'] = df[choice_col].apply(
lambda x: estimate_level_discrete(x, p, L0_choice)
)
return df
# 层级分布分析
def level_distribution_analysis(df, level_col='estimated_level'):
"""分析推理层级的分布特征"""
level_counts = df[level_col].value_counts().sort_index()
# 计算加权平均层级
total = level_counts.sum()
weighted_mean = sum(k * v for k, v in level_counts.items()) / total
# 层级分布的特征
stats = {
'mean_level': weighted_mean,
'mode_level': level_counts.idxmax(),
'pct_level_0': level_counts.get(0, 0) / total * 100,
'pct_level_ge_3': sum(v for k, v in level_counts.items() if k >= 3) / total * 100,
'distribution': level_counts.to_dict()
}
return stats
# 使用示例
# df = pd.read_csv('experiment_data.csv')
# df = batch_level_estimation(df)
# stats = level_distribution_analysis(df)
# print(f"平均推理层级: {stats['mean_level']:.2f}")
# print(f"最常见层级: Level-{stats['mode_level']}")
# print(f"Level-0 占比: {stats['pct_level_0']:.1f}%")
步骤 4:群体 vs 个人策略深度对比¶
from scipy import stats
def compare_group_vs_individual(df, group_col='group_type',
choice_col='choice', level_col='estimated_level'):
"""
对比群体决策和个人决策的策略深度
假设 group_col 包含 'group' 和 'individual'
"""
individual = df[df[group_col] == 'individual']
group = df[df[group_col] == 'group']
results = {}
# 1. 均值比较
t_stat_choice, p_choice = stats.ttest_ind(
individual[choice_col], group[choice_col]
)
results['choice'] = {
'individual_mean': individual[choice_col].mean(),
'group_mean': group[choice_col].mean(),
't_stat': t_stat_choice,
'p_value': p_choice,
'significant': p_choice < 0.05
}
# 2. 层级比较
ind_levels = individual[level_col]
grp_levels = group[level_col]
# Mann-Whitney U(层级是序数而非区间数据)
u_stat, p_level = stats.mannwhitneyu(grp_levels, ind_levels, alternative='greater')
results['level'] = {
'individual_mean_level': ind_levels.mean(),
'group_mean_level': grp_levels.mean(),
'u_stat': u_stat,
'p_value': p_level,
'significant': p_level < 0.05,
'interpretation': '群体推理层级显著高于个人' if p_level < 0.05 else '无显著差异'
}
return results
步骤 5:检测学习效应——层级随轮次的变化¶
def learning_effect_analysis(df, round_col='round', level_col='estimated_level'):
"""
分析推理层级随轮次的学习效应
预期:早期轮次层级低,后期逐渐提高
"""
# 每轮的平均层级
round_levels = df.groupby(round_col)[level_col].agg(['mean', 'std', 'count'])
# 线性趋势检验
from scipy.stats import linregress
rounds = round_levels.index.values
means = round_levels['mean'].values
slope, intercept, r_value, p_value, std_err = linregress(rounds, means)
return {
'round_means': round_levels['mean'].to_dict(),
'slope': slope, # 正值 = 学习效应
'r_squared': r_value**2,
'p_value': p_value,
'interpretation': (
f'每轮平均提升 {slope:.3f} 层' if slope > 0 and p_value < 0.05
else '无显著学习效应'
)
}
# 可视化学习效应
import matplotlib.pyplot as plt
def plot_learning_curve(df, round_col='round', level_col='estimated_level',
group_col='group_type'):
"""绘制分组学习曲线"""
fig, ax = plt.subplots(figsize=(8, 5))
for label, grp in df.groupby(group_col):
round_means = grp.groupby(round_col)[level_col].mean()
ax.plot(round_means.index, round_means.values, 'o-',
label=label, linewidth=2)
ax.axhline(y=0, color='gray', linestyle=':', alpha=0.5)
ax.set_xlabel('轮次')
ax.set_ylabel('平均推理层级')
ax.set_title('学习效应:层级随轮次变化')
ax.legend()
ax.grid(alpha=0.3)
return fig
步骤 6:层级收敛分析——谁在向纳什均衡靠近?¶
def convergence_analysis(df, nash_equilibrium=0,
choice_col='choice', round_col='round'):
"""
分析选择向纳什均衡的收敛
收敛度量 = 当前选择与均衡的距离
"""
df = df.copy()
df['distance_to_nash'] = np.abs(df[choice_col] - nash_equilibrium)
# 按参与者和轮次分析
convergence = df.groupby([round_col])['distance_to_nash'].agg(
['mean', 'std', 'median']
)
# 是否显著收敛?
from scipy.stats import linregress
rounds = convergence.index.values
distances = convergence['mean'].values
slope, intercept, r, p, se = linregress(rounds, distances)
return {
'round_distances': convergence['mean'].to_dict(),
'slope': slope, # 负值 = 正在收敛
'p_value': p,
'converging': slope < 0 and p < 0.05,
'final_round_distance': convergence['mean'].iloc[-1]
}
💡 关键结果解读¶
1. Level-k 分布揭示了什么¶
典型的实验分布:
Level-0: 15-25%(随机选择者——不理解游戏)
Level-1: 35-45%(做了一步推理——"别人会随机选,所以我选 33")
Level-2: 20-30%(做了两步推理)
Level-3+: 10-20%(较高阶推理)
关键发现: 90%+ 的参与者推理 ≤ 2 步
→ 人类的策略推理深度的上限不是理性(纳什均衡),而是认知资源
2. 群体决策通常提升推理深度¶
群体(3 人讨论后达成共识)的选择通常比个人更接近纳什均衡。但机制不是「群体更聪明」——是讨论过程中的推理外部化:每个成员的口头推理暴露给其他成员,加速了策略深度的累积。
3. Level-k 的实践价值¶
- 市场预测:如果大多数市场参与者是 Level-1,你可以通过做 Level-2 获得优势(预测他们的预测)
- 定价策略:你的竞争对手是 Level-k?预测他们的最优反应需要 k+1 步推理
- 招聘面试:猜数博弈可以用作快速策略推理深度测试
限制与边界¶
- 离散层级假设不现实:真实的推理是连续的——有人做 1.5 步推理(部分调整而非完整的一步)
- L0 选择影响所有层级:如果实验参与者默认的 L0 不同于 50(如 30),所有层级估计偏移
- p 值的敏感性:如果 p=½ 而非 ⅔,收敛更快,层级分布压缩
- 学习 ≠ 推理:后期轮次的选择变化可能来自简单适应(「上次选 50 输了,这次选 30」),而非真正的高阶推理
与概念笔记的关联¶
- → 决策理论(C1)——Level-k 是有限理性的量化度量:它不假设无限理性(纳什均衡),而是根据可观察的选择推断实际的推理深度
- → 行为经济学与决策理论三张面孔中「描述理论」的衔接——Level-k 描述「人实际如何推理」,而非规定「人应该怎么推理」
- → 概念笔记「博弈论基础策略互动的数学语法九个原子概念」——Level-k 提供了纳什均衡的实证校准:纳什均衡假设所有人 k→∞,但实证数据显示 90% 的人 k≤2。这意味着在应用博弈论预测时,需要用 k 分布而非点预测——策略推理深度是可观测、可量化的生物学参数,不是理论假设