我希望能够从正态分布中选取值,这些值只能落在0和1之间,在某些情况下,我希望能够返回一个完全随机的分布,而在另一些情况下,我希望返回的值落在高斯分布的形状中。
目前我正在使用以下函数:
def blockedgauss(mu,sigma):
while True:
numb = random.gauss(mu,sigma)
if (numb > 0 and numb < 1):
break
return numb
它从正态分布中选择一个值,然后如果它福尔斯在0到1的范围之外就丢弃它,但我觉得一定有更好的方法来做这件事。
8条答案
按热度按时间6l7fqoea1#
听起来你需要一个truncated normal distribution。使用scipy,你可以使用
scipy.stats.truncnorm
从这样的分布中生成随机变量:上图显示截断正态分布,下图显示具有相同平均值
mu
和标准差sigma
的正态分布。pgky5nke2#
我在寻找一种方法来返回一系列从0和1之间的正态分布中采样的值(即概率)时遇到了这篇文章。为了帮助其他有同样问题的人,我只想指出scipy.stats.truncnorm有一个内置的功能“.rvs”。
因此,如果需要100,000个样本,平均值为0.5,标准差为0.1:
这给出了与numpy.random.normal非常相似的行为,但在所需的范围内。使用内置函数比循环收集样本要快得多,尤其是对于大的N值。
a0zr77ik3#
如果有人想要一个只使用numpy的解决方案,这里有一个使用normal函数和clip的简单实现(MacGyver的方法):
**EDIT:不要使用此方法!!这是您不应该使用方法!!**例如,
a = truncated_normal(np.zeros(10000), 1, -10, 10)
也许看起来很有效但是
b = truncated_normal(np.zeros(10000), 100, -1, 1)
将绝对不会绘制截断的法线,如以下直方图所示:
很抱歉,希望没有人受伤!我想教训是,不要试图模仿MacGyver在编码...干杯,
安德烈斯
deyfvvtc4#
我已经做了一个示例脚本如下。它显示了如何使用API来实现我们想要的功能,例如用已知参数生成样本,如何计算CDF、PDF等。我还附上了一张图片来显示这一点。
wswtfjt75#
实际上,你可以把数据归一化,然后把它转换到你需要的范围。对不起,第一次使用,我不知道如何直接显示图片the function is shown
fquxozlt6#
我已经用numpy测试了一些解决方案,通过试错法,我发现
± variation
除以3是标准差的一个很好的猜测。下面是一些示例:
"基础知识"
比较案例
如果有人有一个更好的方法与numpy,请在下面评论。
xa9qqrwz7#
我使用numpy.random.normal和一些额外的代码开发了一个简单的函数,用于创建一个范围内的值列表。
mlnl4t2r8#
truncnorm
的参数化是复杂的,所以这里有一个函数可以将参数化转换为更直观的东西:如何使用?
1.使用以下参数示例化生成器:* 平均值 、 标准差 * 和 * 截断范围 *:
1.然后,可以使用X生成一个值:
1.或者,具有N个生成值的numpy数组:
视觉示例
以下是三种不同的截断正态分布图: