2012-07-15 121 views
4

有沒有人有效截斷SciPy隨機分佈的建議。例如,如果我生成的隨機值,像這樣:截斷SciPy隨機分佈

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

我怎麼會去限制在0和1之間的輸出值,在不改變分配的原始參數並沒有改變樣品的尺寸,同時還能最大限度地減少機器要做的工作量?

回答

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() 
+0

兩個問題:而不是integrate.quad,你可以直接使用logistic.cdf,而lst = xr [yr user333700 2012-07-15 22:57:06

+0

是的,這些都是很好的一點,但事實證明,無論如何,有一個更好的解決方案......看編輯。 – user1149913 2012-07-16 01:47:04

+0

Logistic有一個很好的ppf表達式,並且用ppf變換一個統一的隨機變量要好得多,但是當ppf計算起來昂貴時,我喜歡你的拒絕採樣配方。 – user333700 2012-07-16 08:40:55

0

你想達到什麼目的? Logistic distribution顧名思義有無限的範圍。如果以任何方式截斷結果,它們的分佈將會改變。如果你只想要範圍內的隨機數字,那麼有random.random()

+0

我使用的物流只是作爲一個例子,但也有其中一個真實世界的分佈將是幾乎相同的情況下理論上的,但由於某些外部約束,實際上不可能超過某個價值。截斷,在很多情況下可能只是添加一個微小的錯誤,可以被認爲是微不足道的建模。如果你不相信,我認爲最好把這看作是一個理論練習。 – TimY 2012-07-15 10:52:51

0

你可以標準化的結果,以最大返回的值:

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

這將保持「形狀」相同,01之間的值。但是如果你從一個分配中重複抽獎,一定要將所有抽獎規範化爲相同的值(所有抽籤中的最大值)。

但是,如果你在做這樣的事情的時候想要做的非常小心,那就是你想要實現的內容(我沒有足夠的信息來評論......)

+0

我很抱歉 - 我不清楚(我更新了這個問題)。我不是指「形狀」,我​​的意思是「原始參數」。另外,我認爲這個(對於某些發行版)可能與更改比例參數具有相同的效果。 – TimY 2012-07-15 10:59:47