如何對任意分布取樣?

2021-10-03 12:18:43 字數 3324 閱讀 1653

import random

n =30

samples =

[i for i in

range

(n)]

weights =

[random.random(

)for i in

range

(n)]

如有 30 個樣本和每個樣本對應的權重,視覺化如下:

plt.figure(figsize=(20

,10))

rects = plt.bar(x=samples, height=weights, width=

0.4, alpha=

0.8, color=

'red'

, label=

"權重"

)# 在每個條上標註數量

for rect in rects:

height = rect.get_height(

) plt.text(rect.get_x(

)+ rect.get_width()/

2, height+

0.01

,str

(int

(height*

100)

/100

), ha=

"center"

, va=

"bottom"

)plt.ylim(0,

1.1*

max(weights)

)plt.xticks(samples)

plt.xlabel(

'類別'

)plt.ylabel(

'權重'

注意到上面的分布甚至沒有進行歸一化,即所有權值的和不等於1。

那麼有什麼辦法可以對上述分布進行取樣呢?比如需要獲得 1000 個新樣本,樣本數量服從上面的任意分布。

下面就來介紹取樣方法!

其實這個方法大家都見過,就是輪盤賭

任意離散分布都可以畫在輪盤上,重取樣只需要隨機地旋轉輪盤即可!

def

sample

(weights, labels, n_new =

none):

if n_new is

none

: n_new =

len(labels)

n =len(labels)

p =index =

int(random.random(

)* n)

beta =

0.0# 輪盤指標

mw =

max(weights)

for _ in

range

(n_new)

: beta += random.random()*

2.0* mw

while beta > weights[index]

: beta -= weights[index]

index =

(index +1)

% n)

return p

下面用上面的函式進行1000輪重取樣:

samples = resample(weights,

list

(set

(samples)),

1000

)weights =

[np.

sum(np.array(samples)

==i)

for i in

range

(n)]

結果如下:

是不是和預期的分布是一致的!

現在,你也學會取樣了吧!

上面的取樣函式也可以用如下方式實現,原理是一樣的!

def

sample

(weights, labels, n_new =

none):

assert

(len

(weights)

==len

(labels)

)if n_new is

none

: n_new =

len(labels)

n =len(labels)

p =cs = np.cumsum(weights)

# 累計求和函式

for _ in

range

(n_new)

: angle = random.random(

)* cs[-1

]# 隨機轉動乙個角度

for i in

range

(len

(labels)):

if angle > cs[i]

:# 轉過第 i 項

continue

else

:# 恰好落在第 i 項

輪盤賭取樣和逆變換取樣

的原理一樣的,不過乙個**於生活,乙個**於公式!

Cholesky分解對任意多維高斯分布進行取樣

如果 a 是正定hermite矩陣,則 a可以分解為a llh 證明可見任意矩陣教材。引理由高斯分布的線性變換性質可知,如果x n 並且有滿秩線性變換y kx b 則y n k b,k k 證明 令x k 1 y b 則lnp x c x 1 x c k 1 y b 1 k 1 y b c y b ...

均勻分布對映到任意分布

當我們想對某些特定的分布進行抽樣時,由於電腦演算法只能產生服從於均勻分布的偽隨機數,我們可以通過對映的方式來獲取特定分布的抽樣。於是引出下面的問題 假設隨機變數 x sim u 0,1 對於已知對映 y g x 我們知道如何計算 y 的概率密度函式。但是,如果我們已知的是 y 的概率密度函式 d y...

對夏農取樣定理的理解

在學習課程 計算機控制技術 時,第二章講到了夏農取樣定理。有一些疑惑 從公式的推導上易得乙個非週期的訊號經過一定頻率的取樣後,在頻率上變成了乙個週期的頻譜訊號,但是一直都不大清楚其具體的物理意義。上網檢視了很多回答和資料在這裡說一點自己的理解吧。時域 頻域 所謂傅利葉變換,就是將滿足一定條件的某個函...