This question already has answers here:
How to specify upper and lower limits when using numpy.random.normal

(5个答案)


9个月前关闭。




从事机器学习任务。我们应该得到一组带约束的随机w.r.t正态分布。我们可以使用np.random.normal()获得正态分布号,但它不提供任何绑定(bind)参数。我想知道怎么做吗?

最佳答案

truncnorm参数化是,因此这是一个将参数化转换为更直观的函数:

from scipy.stats import truncnorm

def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
    return truncnorm(
        (low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)



如何使用它?
  • 使用以下参数对生成器进行实例化:平均值,标准偏差和截断范围:
    >>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
    
  • 然后,您可以使用X生成一个值:
    >>> X.rvs()
    6.0491227353928894
    
  • 或者,一个具有N个生成值的numpy数组:
    >>> X.rvs(10)
    array([ 7.70231607,  6.7005871 ,  7.15203887,  6.06768994,  7.25153472,
            5.41384242,  7.75200702,  5.5725888 ,  7.38512757,  7.47567455])
    


  • 视觉示例

    这是三个不同的截断正态分布的图:
    X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10)
    X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10)
    X3 = get_truncated_normal(mean=8, sd=1, low=1, upp=10)
    
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots(3, sharex=True)
    ax[0].hist(X1.rvs(10000), normed=True)
    ax[1].hist(X2.rvs(10000), normed=True)
    ax[2].hist(X3.rvs(10000), normed=True)
    plt.show()
    

    python - 如何获得numpy范围内的正态分布? [复制]-LMLPHP

    关于python - 如何获得numpy范围内的正态分布? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36894191/

    10-12 14:01