问题描述
在机器学习任务中.我们应该得到一组带约束的随机w.r.t正态分布.我们可以使用np.random.normal()
来获得正态分布号,但它不提供任何绑定参数.我想知道该怎么做?
In machine learning task. We should get a group of random w.r.t normal distribution with bound. We can get a normal distribution number with np.random.normal()
but it does't offer any bound parameter. I want to know how to do that?
推荐答案
truncnorm
的参数化很复杂,因此这里提供了一个将参数化转换为更直观的功能的函数:
The parametrization of truncnorm
is complicated, so here is a function that translates the parametrization to something more intuitive:
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)
如何使用它?
How to use it?
-
使用以下参数实例化生成器:平均值,标准偏差和截断范围:
>>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
然后,您可以使用X生成一个值:
Then, you can use X to generate a value:
>>> X.rvs()
6.0491227353928894
或者,一个具有N个生成值的numpy数组:
Or, a numpy array with N generated values:
>>> X.rvs(10)
array([ 7.70231607, 6.7005871 , 7.15203887, 6.06768994, 7.25153472,
5.41384242, 7.75200702, 5.5725888 , 7.38512757, 7.47567455])
视觉示例
这是三个不同的截断正态分布的图:
A Visual Example
Here is the plot of three different truncated normal distributions:
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()
这篇关于如何获得numpy范围内的正态分布?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!