截断SciPy随机分布

时间:2012-07-15 10:01:05

标签: python random statistics scipy

是否有人建议有效截断SciPy随机分布。例如,如果我生成如下随机值:

import scipy.stats as stats
print stats.logistic.rvs(loc=0, scale=1, size=1000)

如何在不改变分布的原始参数和不改变样本大小的情况下将输出值约束在0和1之间,同时最大限度地减少机器必须完成的工作量?

3 个答案:

答案 0 :(得分:5)

您的问题更多的是统计问题,而不是scipy问题。通常,您需要能够在您感兴趣的间隔内进行标准化,并分析地计算此间隔的CDF,以创建有效的采样方法。 编辑:事实证明这是可能的(不需要拒绝抽样):

import scipy.stats as stats

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as rnd

#plot the original distribution
xrng=np.arange(-10,10,.1)
yrng=stats.logistic.pdf(xrng)
plt.plot(xrng,yrng)

#plot the truncated distribution
nrm=stats.logistic.cdf(1)-stats.logistic.cdf(0)
xrng=np.arange(0,1,.01)
yrng=stats.logistic.pdf(xrng)/nrm
plt.plot(xrng,yrng)

#sample using the inverse cdf
yr=rnd.rand(100000)*(nrm)+stats.logistic.cdf(0)
xr=stats.logistic.ppf(yr)
plt.hist(xr,normed=True)

plt.show()

答案 1 :(得分:0)

你想要达到什么目的?根据定义,Logistic distribution具有无限范围。如果以任何方式截断结果,它们的分布将发生变化。如果你只是想在范围内随机数字,那就是random.random()

答案 2 :(得分:0)

您可以将结果标准化为最大返回值:

>>> dist = stats.logistic.rvs(loc=0, scale=1, size=1000)
>>> norm_dist = dist / np.max(dist)

这会使'shape'保持不变,并保持01之间的值。但是如果您正在从分布中重复绘制,请务必将所有绘制标准化为相同的值(所有绘制的最大值)。

但是,如果你在你想要实现的目标(我没有足够的信息评论......)的情况下做这种事情,你要非常小心。 p>