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
ます。ただし、分布から繰り返し抽選を行う場合は、必ずすべての抽選を同じ値 (すべての抽選の最大値) に正規化してください。
ただし、達成しようとしていることのコンテキスト内で意味のあるこの種のことを行う場合は、かなり注意する必要があります (コメントするのに十分な情報がありません...)