Python 如何在numpy中获得一个范围内的正态分布?

Python 如何在numpy中获得一个范围内的正态分布?,python,numpy,random,machine-learning,normal-distribution,Python,Numpy,Random,Machine Learning,Normal Distribution,在机器学习任务中。我们应该得到一组有界的随机w.r.t正态分布。我们可以使用np.random.normal()获得正态分布数,但它不提供任何绑定参数。我想知道如何做到这一点?如果您正在查找,SciPy有一个函数,名为 此分布的标准形式是标准正态分布 范围[a,b]-注意,a和b是在域上定义的 标准的正常值。转换特定平均值的剪辑值的步骤和 标准偏差,使用: a、 b=(myclip\u a-我的意思)/我的性病,(myclip\u b-我的意思)/我的性病 truncnorm将a和b作为形状参数

在机器学习任务中。我们应该得到一组有界的随机w.r.t正态分布。我们可以使用
np.random.normal()
获得正态分布数,但它不提供任何绑定参数。我想知道如何做到这一点?

如果您正在查找,SciPy有一个函数,名为

此分布的标准形式是标准正态分布 范围[a,b]-注意,a和b是在域上定义的 标准的正常值。转换特定平均值的剪辑值的步骤和 标准偏差,使用:

a、 b=(myclip\u a-我的意思)/我的性病,(myclip\u b-我的意思)/我的性病

truncnorm将a和b作为形状参数

上面的示例以-2和2为界,并返回10个随机变量(使用
.rvs()
方法)

这是-6,6的柱状图:


除了@bakkal suggestion(+1)之外,您可能还想看看实现这一点的方法,将其改写为模块。

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生成一个值:

    >>> 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实现的:


    quad_-vec(eval('scipy.stats.norm.pdf'),1,4,points=[0.5,2.5,3,4],full_-output=True)

    正态分布数据的随机样本不应该是无界的吗?为什么不使用truncnorm(a=-2,b=2,scale=1)只是为了明确a和b是形状参数,否则读者可能尝试-2,2的比例不同于1,然后获取[-2,2]+1之外的随机值。但是,值得注意的是,如果函数内部立即使用
    get\u truncated\u normal.rvs()
    ,而不是在外部调用它,那么函数会更快。当然,这只有在你想要随机抽签的情况下才有帮助。这并不是100%都能正常工作。使用low=0,upp=1,有时会给出负数。
    >>> X.rvs()
    6.0491227353928894
    
    >>> 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()