You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给定均值及上下误差时,如何正确计算分裂正态分布?

分裂正态分布采样的正确性分析

嘿,咱们来拆解下你这个分裂正态分布的采样问题。首先得明确:标准的分裂正态分布(Split-normal distribution)并不是简单50/50概率选左右侧标准差,你的现有实现逻辑和统计学定义的分布不匹配,下面具体说:

先搞懂标准分裂正态分布的核心规则

分裂正态分布是在均值$\mu$处“劈开”的混合分布:

  • 当$x \leq \mu$时,它是均值为$\mu$、标准差为$\sigma_l$(你的lower_sigma)的正态分布的左半部分
  • 当$x > \mu$时,它是均值为$\mu$、标准差为$\sigma_u$(你的upper_sigma)的正态分布的右半部分

关键要求是:概率密度在$\mu$处必须连续。这意味着左右两侧的采样概率不能相等,而是要和各自的标准差成反比——因为正态分布在均值处的密度高度是$\frac{1}{\sqrt{2\pi}\sigma}$,为了让两侧密度在$\mu$处衔接,采样权重得满足:

  • 采样右侧(用$\sigma_u$)的概率:$\frac{\sigma_l}{\sigma_l + \sigma_u}$
  • 采样左侧(用$\sigma_l$)的概率:$\frac{\sigma_u}{\sigma_l + \sigma_u}$

你的现有代码问题

你用choice([upper_sigma, -lower_sigma])给左右侧分配了各50%的采样概率,这会导致生成的样本分布不符合标准分裂正态的定义。比如你用的参数$\mu=1.0, \sigma_u=2.0, \sigma_l=1.0$,理论上左侧样本应该占$\frac{2}{1+2}≈66.7%$,右侧占33.3%,但你的代码会生成各50%的样本,直方图形态自然和预期有偏差。

修正后的正确实现

按照标准定义调整采样逻辑,用正确的概率权重选择左右侧:

from random import random, gauss

def random_split_normal(mu: float, upper_sigma: float, lower_sigma: float) -> float:
    sigma_left = lower_sigma
    sigma_right = upper_sigma
    # 计算采样右侧的概率权重
    prob_right = sigma_left / (sigma_left + sigma_right)
    if random() < prob_right:
        # 右侧:正半正态样本 × 右侧标准差 + 均值
        return abs(gauss(0.0, 1.0)) * sigma_right + mu
    else:
        # 左侧:负半正态样本 × 左侧标准差 + 均值
        return -abs(gauss(0.0, 1.0)) * sigma_left + mu

怎么验证?

你可以生成足够多的样本(比如10000个),然后:

  • 统计左侧(<1.0)和右侧(>1.0)的样本占比,修正后的代码应该接近66.7%和33.3%
  • 对比直方图和理论分裂正态分布的概率密度曲线,修正后的形态会更贴合预期

额外补充

如果你的需求是自定义的等概率左右采样分布,那你的原始代码是符合需求的,但这不是统计学上定义的分裂正态分布。如果目标是实现标准的分裂正态,必须按照概率权重来选择分支。

内容的提问来源于stack exchange,提问作者ajrlewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:46:28