如何获得numpy范围内的正态分布?
machine-learning
numpy
python
6
0

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

如果您正在寻找“ 截断正态分布” ,SciPy有一个名为truncnorm的函数。

此分布的标准形式是截断为[a,b]范围的标准正态-请注意,a和b是在标准正态的域上定义的。要为特定的均值和标准差转换片段值,请使用:

a,b =(myclip_a-my_mean)/ my_std,(myclip_b-my_mean)/ my_std

truncnorm将a和b作为形状参数。

>>> from scipy.stats import truncnorm
>>> truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10)
array([-1.83136675,  0.77599978, -0.01276925,  1.87043384,  1.25024188,
        0.59336279, -0.39343176,  1.9449987 , -1.97674358, -0.31944247])

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

>>> min(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
-1.9996074381484044
>>> max(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
1.9998486576228549

这是-6、6的直方图:

在此处输入图片说明

收藏
评论

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)


如何使用它?

  1. 使用以下参数实例化生成器: mean标准偏差截断范围

     >>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10) 
  2. 然后,您可以使用X生成一个值:

     >>> X.rvs() 6.0491227353928894 
  3. 或者,一个具有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()

在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号