2. 基于马尔可夫链的文本合成数据生成

任务目标

给定均值 μ 和标准差 σ,生成一组符合正态分布 N(μ, σ²) 的数值型数据,用于模拟身高或体重等连续型变量。本案例使用 Python 标准库与 NumPy 实现,不依赖外部数据文件。

实现方案

使用 NumPy 的 random.normal 方法生成指定规模的样本。为便于复现,设置随机种子。生成后计算样本均值与标准差,与目标参数对比以验证生成质量。

完整代码

import numpy as np

def generate_normal_data(mean: float, std: float, size: int, seed: int = 42) -> np.ndarray:
    """
    生成服从正态分布的数值数据。

    参数:
        mean: 目标均值 μ
        std:  目标标准差 σ
        size: 样本数量
        seed: 随机种子,保证可复现

    返回:
        np.ndarray: 生成的样本数组
    """
    rng = np.random.default_rng(seed)
    return rng.normal(loc=mean, scale=std, size=size)

if __name__ == "__main__":
    # 模拟身高:均值 170cm,标准差 6cm
    mu, sigma, n = 170.0, 6.0, 1000
    samples = generate_normal_data(mu, sigma, n)

    # 验证:计算样本统计量
    sample_mean = np.mean(samples)
    sample_std = np.std(samples, ddof=1)  # 样本标准差

    print(f"目标参数: μ={mu}, σ={sigma}")
    print(f"样本统计: 均值={sample_mean:.2f}, 标准差={sample_std:.2f}")
    print(f"前5个样本: {samples[:5]}")

运行方式

  1. 安装依赖:pip install numpy
  2. 将代码保存为 generate_normal.py,执行 python generate_normal.py

验证方法

程序输出样本均值与标准差。由于随机抽样存在波动,当样本量 n ≥ 1000 时,样本均值与目标 μ 的偏差通常在 ±0.3 以内,样本标准差与目标 σ 的偏差通常在 ±0.2 以内。若偏差明显超出此范围,说明随机种子或参数设置有误。

预期输出(示例)

目标参数: μ=170.0, σ=6.0
样本统计: 均值=169.98, 标准差=6.05
前5个样本: [168.32 171.45 169.87 172.10 167.93]

注:具体数值因随机种子而异,但统计量应接近目标参数。

常见问题

  • 样本标准差与 σ 偏差较大:增加样本量(如 n=10000)可减小波动。
  • 需要整数型数据:可在生成后调用 np.round() 取整,但会略微改变标准差。