Python 如何在numpy中获得一个范围内的正态分布?
在机器学习任务中。我们应该得到一组有界的随机w.r.t正态分布。我们可以使用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作为形状参数
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.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()
您可以将目标范围(按惯例)细分为相等的分区,然后计算每个和所有区域的积分,然后根据曲面对每个分区调用统一方法。 它是用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()