分裂正态分布

Split-normal distribution

给定具有上下误差的平均值,计算分裂正态分布的最佳方法是什么?

到目前为止我有:

from random import choice, gauss
def random_split_normal(mu: float, upper_sigma: float, lower_sigma:int) -> float:
    return abs(gauss(0.0, 1.0)) * choice([upper_sigma, -lower_sigma]) + mu

我多次调用它来生成一个数组:

random_array = []
for _ in range(1000):
    random_array.append(random_split_normal(1.0, 2.0, 1.0))

在制作 random_array 的直方图时会产生以下结果:

我想知道随机使用 upper_sigmalower_sigma 是否是正确的方法?

您的解决方案在数学上是等价的,但效率较低,因为您不必要地应用了 abs() 和 choice(),您可以在其中查看 gauss() 的符号。

这应该接近定义。我还重新调整了 sigmas 以符合我们通常的数轴方向(左侧为负无穷大)

def random_split_normal(mu: float, lower_sigma: float, upper_sigma: float) -> float:
    z = gauss(0, 1)
    return mu + z * (lower_sigma if z < 0 else upper_sigma)