離散取樣Sampling

2021-10-23 07:37:15 字數 2888 閱讀 4358

給定乙個離散型隨機變數的概率分布規律p(x

=i)=

pi,i

∈1,.

..

np(x=i)=p_i,i\in

p(x=i)

=pi​

,i∈1

,...

n,希望設計乙個方法能夠從該概率分布中進行取樣使得取樣結果盡可能服從概率分布p

上面在通過累加的方式構造出累積事件概率陣列後,我們可以發現該陣列滿足非遞減有序,對於有序陣列的查詢很容易想到使用二分查詢進行優化,使用二分查詢後的時間複雜度為o(l

ogn)

o(logn)

o(logn

)alias方法整個概率分布轉化為乙個1*n的矩形,對於每個事件i,轉換為對應矩形中的面積為pi∗

n∑k=

1k=n

pk

\frac^p_k}

∑k=1k=

n​pk

​pi​

∗n​通過上述操作,一般會有某些位置面積大於1某些位置的面積小於1。我們通過將面積大於1的事件多出的面積補充到面積小於1對應的事件中,以確保每乙個小方格的面積為1,同時,保證每一方格至多儲存兩個事件。

維護兩個陣列accept和alias,accept陣列中的accept[i]表示事件i佔第i列矩形的面積的比例。

alias[i]表示第i列中不是事件i的另乙個事件的編號

在進行取樣的時候,每次生成乙個隨機數i∈[

0,n)

i∈[0,n)

i∈[0,n

),再生成乙個隨機數r∼u

nif(

0,1)

r∼unif(0,1)

r∼unif

(0,1

),若r

cept

[i]r

rcept

[i],則表示接受事件i,否則,拒絕事件i返回ali

as[i

]alias[i]

alias[

i]該演算法對應的**如下,可以看到預處理alias table的時間複雜度仍為o(n),而每次取樣產生時間的時間複雜度為o(1)。

import numpy as np

defgen_prob_dist

(n):

p = np.random.randint(0,

100,n)

return p/np.

sum(p)

defcreate_alias_table

(area_ratio)

: l =

len(area_ratio)

accept, alias =[0

]* l,[0

]* l

small, large =

,[]for i, prob in

enumerate

(area_ratio)

:if prob <

1.0:

else

:while small and large:

small_idx, large_idx = small.pop(

), large.pop(

) accept[small_idx]

= area_ratio[small_idx]

alias[small_idx]

= large_idx

area_ratio[large_idx]

= area_ratio[large_idx]-(

1- area_ratio[small_idx]

)if area_ratio[large_idx]

<

1.0:

else

:while large:

large_idx = large.pop(

) accept[large_idx]=1

while small:

small_idx = small.pop(

) accept[small_idx]=1

return accept,alias

defalias_sample

(accept, alias)

: n =

len(accept)

i =int(np.random.random(

)*n)

r = np.random.random(

)if r < accept[i]

:return i

else

:return alias[i]

defsimulate

(n=100

,k=10000,)

:

truth = gen_prob_dist(n)

area_ratio = truth*n

accept,alias = create_alias_table(area_ratio)

ans = np.zeros(n)

for _ in

range

(k):

i = alias_sample(accept,alias)

ans[i]+=1

return ans/np.

sum(ans)

,truth

if __name__ ==

"__main__"

: alias_result,truth = simulate(

)

alias method離散分布隨機取樣

darts, dice, and coins: sampling from a discrete distribution

【數學】時間複雜度o(1)的離散取樣演算法—— alias method/別名取樣方法

alias:時間複雜度o(1)的離散取樣方法

漫談「取樣」(sampling)

越學越懵了,計算機中是怎麼進行取樣的,用了這麼久的 rand 函式,到現在才知道是怎麼做的。計算機中通過線性同餘發生器 linear congruential generator,lcg 很容易從乙個 x sim uniform 0,1 的均勻分布中進行取樣。如果要從 y sim uniform a...

離散時間訊號取樣

1.脈衝串取樣 由取樣過程形成的新序列,在取樣週期n的整數倍點上就等於原序列,而在取樣點之間都是零。原序列 取樣訊號和新序列的時域波形如下 從上圖中可以看出,x n p n xp n 之間的關係可表示為 xp n x n p n 於是,這三者之間的頻域關係可表示為卷積。從上圖可以看出卷積的搬移效果,...

降取樣,過取樣,欠取樣,子取樣,下取樣,上取樣

取樣 2048hz對訊號來說是過取樣了,事實上只要訊號不混疊就好 滿足尼奎斯特取樣定理 所以可 以對過取樣的訊號作抽取,即是所謂的 降取樣 在現場中取樣往往受具體條件的限止,或者不存在300hz的取樣率,或除錯非常困難等等。若 r 1,則rfs 2就遠大於音訊訊號的最高頻率fm,這使得量化雜訊大部分...