有没有人对高效截断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()
>>> dist = stats.logistic.rvs(loc=0, scale=1, size=1000)
>>> norm_dist = dist / np.max(dist)
这将保持“形状”不变,并且值介于0
和1
之间。但是,如果您从分布中进行重复抽样,请确保将所有抽样归一化为相同的值(来自所有抽样的最大值)。
然而,如果您正在进行此类操作,您需要非常小心,以确保它在您尝试实现的上下文中有意义(我没有足够的信息来发表评论...)
random.random()
。