Skip to content

用 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 分布而非点预测——策略推理深度是可观测、可量化的生物学参数,不是理论假设