如有 30 個樣本和每個樣本對應的權重,視覺化如下:import random
n =30
samples =
[i for i in
range
(n)]
weights =
[random.random(
)for i in
range
(n)]
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...
對夏農取樣定理的理解
在學習課程 計算機控制技術 時,第二章講到了夏農取樣定理。有一些疑惑 從公式的推導上易得乙個非週期的訊號經過一定頻率的取樣後,在頻率上變成了乙個週期的頻譜訊號,但是一直都不大清楚其具體的物理意義。上網檢視了很多回答和資料在這裡說一點自己的理解吧。時域 頻域 所謂傅利葉變換,就是將滿足一定條件的某個函...