Alias 抽樣演算法 python實現

2021-09-11 09:22:58 字數 1655 閱讀 7324

理論基礎

以圖為例,凡是4代表的就是概率型別數的意思

a,記錄下面那些部分的概率值(乘以4以後)

b,記錄上面部分來自哪個根柱子,用哪根柱子的不來用來補足,使之概率為1

:param probs: 是乙個概率的list

:return:

"""num =

len(probs)

a = np.zeros(num, dtype=np.float32)

b = np.ones(num, dtype=np.

int)*-

1# -1 用來表示,本身自己就足夠了,和那些用第一根柱子(下標0)的區分開來

small, large =

,# 記錄乘以4以後的概率 大於1還是小於1 的下標

for i, prob in

enumerate

(probs)

: a[i]

= num * prob # 概率乘以型別數(4)

if a[i]

<

1.0:

else

:while

len(small)

>

0and

len(large)

>0:

smaller = small.pop(

)# 從大小中各任取乙個

larger = large.pop(

) a[larger]

= a[smaller]

+ a[larger]

-1.0

# a用來記錄本身的概率,而不是加上去的那一部分的概率

b[smaller]

= larger # b用來記錄完成每個柱子=1的操作,補自哪個柱子

if a[larger]

<

1.0:

# 記錄大於1的那個概率,給了別人以後,剩下部分是不是還是大於1(是不是還能繼續給別人)

else

:return a, b

>>

>

print

(alias_setup(

[0.4

,0.1

,0.2

,0.3])

)(array([1

.,0.4,

0.8,

0.39999998

], dtype=float32)

, array([-

1,3,

3,0]

))>>

>

print

(alias_setup(

[0.2

,0.3

,0.1

,0.4])

)(array(

[0.8,1

.,0.4,

0.79999995

], dtype=float32)

, array([3

,-1,

3,1]

))

python 抽樣 python實現抽樣分布描述

本次使用木東居士提供資料案例,驗證資料分布等內容,資料讀取 df pd.read excel c users zxy desktop usecols 1,2,3 1.按照港口分類,計算各類港口資料 年齡 車票 的統計量。df1 df.groupby embarked df1.describe 或 變...

水庫抽樣演算法

輸入 一組資料,大小未知 輸出 這組資料的k個均勻抽取 要求 僅掃瞄一次 總體要求 從n個元素中隨機的抽取k個元素,其中n無法確定,保證每個元素抽到的概率相同 一些符號 k為要抽樣的個數,n為總體個數字置,n為當前遍歷的元素的位置。pool為k大小的陣列,用來儲存抽到的樣本 n k,把當前值放入po...

水塘抽樣演算法

作用 水塘抽樣演算法是一種抽樣演算法,對於乙個很大的集合,抽取的樣本值能夠保證隨機.特點 其複雜度並不很高o n 並且能夠很大程度地節省記憶體.很多大公司的面試題都考察過這個演算法,以谷歌為例,有一道關於水塘抽樣的例題 我有乙個長度為n的鍊錶,n的值非常大,我不清楚n的確切值.我怎樣能寫乙個盡可能高...