有没有人有关于有效截断 SciPy 随机分布的建议。例如,如果我像这样生成随机值:
import scipy.stats as stats
print stats.logistic.rvs(loc=0, scale=1, size=1000)
我将如何在不改变分布的原始参数和不改变样本大小的情况下将输出值限制在 0 和 1 之间,同时最大限度地减少机器必须做的工作量?
有没有人有关于有效截断 SciPy 随机分布的建议。例如,如果我像这样生成随机值:
import scipy.stats as stats
print stats.logistic.rvs(loc=0, scale=1, size=1000)
我将如何在不改变分布的原始参数和不改变样本大小的情况下将输出值限制在 0 和 1 之间,同时最大限度地减少机器必须做的工作量?
您的问题更像是一个统计问题,而不是一个 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,density=True)
plt.show()
你想达到什么目的?根据定义,逻辑分布具有无限范围。如果您以任何方式截断结果,它们的分布将会改变。如果你只想在范围内随机数,有random.random()
.
您可以将结果标准化为最大返回值:
>>> dist = stats.logistic.rvs(loc=0, scale=1, size=1000)
>>> norm_dist = dist / np.max(dist)
这将保持“形状”相同,以及 和 之间的0
值1
。但是,如果您要从分布中重复抽取,请确保将所有抽取标准化为相同的值(所有抽取的最大值)。
但是,如果你在你想要达到的目标的范围内做这种有意义的事情,你要非常小心(我没有足够的信息来评论......)