有沒有人有效截斷SciPy隨機分佈的建議。例如,如果我生成的隨機值,像這樣:截斷SciPy隨機分佈
import scipy.stats as stats
print stats.logistic.rvs(loc=0, scale=1, size=1000)
我怎麼會去限制在0和1之間的輸出值,在不改變分配的原始參數並沒有改變樣品的尺寸,同時還能最大限度地減少機器要做的工作量?
有沒有人有效截斷SciPy隨機分佈的建議。例如,如果我生成的隨機值,像這樣:截斷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,normed=True)
plt.show()
你想達到什麼目的? Logistic distribution顧名思義有無限的範圍。如果以任何方式截斷結果,它們的分佈將會改變。如果你只想要範圍內的隨機數字,那麼有random.random()
。
我使用的物流只是作爲一個例子,但也有其中一個真實世界的分佈將是幾乎相同的情況下理論上的,但由於某些外部約束,實際上不可能超過某個價值。截斷,在很多情況下可能只是添加一個微小的錯誤,可以被認爲是微不足道的建模。如果你不相信,我認爲最好把這看作是一個理論練習。 – TimY 2012-07-15 10:52:51
你可以標準化的結果,以最大返回的值:
>>> dist = stats.logistic.rvs(loc=0, scale=1, size=1000)
>>> norm_dist = dist/np.max(dist)
這將保持「形狀」相同,0
和1
之間的值。但是如果你從一個分配中重複抽獎,一定要將所有抽獎規範化爲相同的值(所有抽籤中的最大值)。
但是,如果你在做這樣的事情的時候想要做的非常小心,那就是你想要實現的內容(我沒有足夠的信息來評論......)
我很抱歉 - 我不清楚(我更新了這個問題)。我不是指「形狀」,我的意思是「原始參數」。另外,我認爲這個(對於某些發行版)可能與更改比例參數具有相同的效果。 – TimY 2012-07-15 10:59:47
兩個問題:而不是integrate.quad,你可以直接使用logistic.cdf,而lst = xr [yr
user333700
2012-07-15 22:57:06
是的,這些都是很好的一點,但事實證明,無論如何,有一個更好的解決方案......看編輯。 – user1149913 2012-07-16 01:47:04
Logistic有一個很好的ppf表達式,並且用ppf變換一個統一的隨機變量要好得多,但是當ppf計算起來昂貴時,我喜歡你的拒絕採樣配方。 – user333700 2012-07-16 08:40:55