溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布

發(fā)布時(shí)間:2022-01-04 17:40:12 來源:億速云 閱讀:194 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1. 二項(xiàng)(binomial)/伯努利(Bernoulli)分布

1.1 概率質(zhì)量函數(shù)(pmf)

Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布

二項(xiàng)分布P(X=x; n, p)可以表示進(jìn)行獨(dú)立重復(fù)試驗(yàn)n次,每次有兩成功和失敗可能結(jié)果(分別對(duì)應(yīng)概率p和1−p),共成功x次的概率。

1.2 函數(shù)原型

random.binomial(n, p, size=None)

參數(shù):

n: int or array_like of ints &ensp; 對(duì)應(yīng)分布函數(shù)中的參數(shù) n,>=0,浮點(diǎn)數(shù)會(huì)被截?cái)酁檎巍?br/>p: float or array_like of floats &ensp; 對(duì)應(yīng)分布函數(shù)參數(shù)p, >=0并且<=1。
size: int or tuple of ints, optional &ensp; 如果給定形狀為(m,n,k),那么m&times;n&times;k個(gè)隨機(jī)樣本會(huì)從中抽取。默認(rèn)為None,即返回一個(gè)一個(gè)標(biāo)量隨機(jī)樣本。

返回:

out: ndarray or scalar&ensp; 從帶參數(shù)的概率分布中采的隨機(jī)樣本,每個(gè)樣本表示獨(dú)立重復(fù)實(shí)驗(yàn)n次中成功的次數(shù)。

1.3 使用樣例

設(shè)進(jìn)行獨(dú)立重復(fù)實(shí)驗(yàn)10次,每次成功概率為0.5,采樣樣本表示總共的成功次數(shù)(相當(dāng)于扔10次硬幣,正面朝上的次數(shù))??偣膊?0個(gè)樣本。

import numpy as np
n, p = 10, .5  
s = np.random.binomial(n, p, 20)
print(s) # [4 5 6 5 4 2 4 6 7 2 4 4 2 4 4 7 6 3 5 6]

可以粗略的看到,樣本幾乎都在5周圍上下波動(dòng)。
我們來看一個(gè)有趣的例子。一家公司鉆了9口井,每口井成功的概率為0.1,所有井都失敗了,發(fā)生這種情況的概率是多少?
我們總共采樣2000次,來看下產(chǎn)生0結(jié)果的概率。

s = sum(np.random.binomial(9, 0.1, 20000) == 0)/20000.
print(s) # 0.3823

可見,所有井失敗的概率為0.3823,這個(gè)概率還是蠻大的。

2. 多項(xiàng)(multinomial)分布

2.1 概率質(zhì)量函數(shù)(pmf)

Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布

也就是說,多項(xiàng)分布式二項(xiàng)分布的推廣:仍然是獨(dú)立重復(fù)實(shí)驗(yàn)n次,但每次不只有成功和失敗兩種結(jié)果,而是k種可能的結(jié)果,每種結(jié)果的概率為pi。多項(xiàng)分布是一個(gè)隨機(jī)向量的分布,x=(x1,x2,...,xk)意為第i種結(jié)果出現(xiàn)xi次,P(X=x; n, p)也就表示第i種結(jié)果出現(xiàn)xi次的概率。

2.2 函數(shù)原型

random.multinomial(n, pvals, size=None)

參數(shù):

n: int &ensp; 對(duì)應(yīng)分布函數(shù)中的參數(shù) n。
pvals: sequence of floats &ensp; 對(duì)應(yīng)分布函數(shù)參數(shù)p, 其長度等于可能的結(jié)果數(shù)k,并且有0?pi?1。
size: int or tuple of ints, optional &ensp; 為輸出形狀大小,因?yàn)椴沙龅拿總€(gè)樣本是一個(gè)隨機(jī)向量,默認(rèn)最后一維會(huì)自動(dòng)加上k,如果給定形狀為(m,n),那么m&times;n個(gè)維度為k的隨機(jī)向量會(huì)從中抽取。默認(rèn)為None,即返回一個(gè)一個(gè)k維的隨機(jī)向量。

返回:

out: ndarray &ensp; 從帶參數(shù)的概率分布中采的隨機(jī)向量,長度為可能的結(jié)果數(shù)k,如果沒有給定 size,則shape為 (k,)。

2.3 使用樣例

設(shè)進(jìn)行獨(dú)立重復(fù)實(shí)驗(yàn)20次,每次情況的概率為1/6,采樣出的隨機(jī)向量表示每種情況出現(xiàn)次數(shù)(相當(dāng)于扔20次六面骰子,點(diǎn)數(shù)為0, 1, 2, ..., 5出現(xiàn)的次數(shù))。總共采1個(gè)樣本。

s = np.random.multinomial(20, [1/6.]*6, size=1)
print(s) # [[4 2 2 3 5 4]]

當(dāng)然,如果不指定size,它直接就會(huì)返回一個(gè)一維向量了

s = np.random.multinomial(20, [1/6.]*6)
print(s) # [4 1 4 3 5 3]

如果像進(jìn)行多次采樣,改變 size即可:

s = np.random.multinomial(20, [1/6.]*6, size=(2, 2))
print(s)
# [[[4 3 4 2 6 1]
#   [5 2 1 6 3 3]]

#  [[5 4 1 1 6 3]
#   [2 5 2 5 4 2]]]

這個(gè)函數(shù)在論文<sup>[1]</sup>的實(shí)現(xiàn)代碼<sup>[2]</sup>中用來設(shè)置每一個(gè) client分得的樣本數(shù):

for cluster_id in range(n_clusters): 
    weights = np.random.dirichlet(alpha=alpha * np.ones(n_clients))
    clients_counts[cluster_id] = np.random.multinomial(clusters_sizes[cluster_id], weights)
    # 一共扔clusters_sizes[cluster_id]次篩子,該函數(shù)返回骰子落在某個(gè)client上各多少次,也就對(duì)應(yīng)著該client應(yīng)該分得的樣本數(shù)

3.均勻(uniform)分布

3.1 概率密度函數(shù)(pdf)

Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布

均勻分布可用于隨機(jī)地從連續(xù)區(qū)間[a,b)內(nèi)進(jìn)行采樣。

3.2 函數(shù)原型

random.uniform(low=0.0, high=1.0, size=None)

參數(shù):

low: float or array_like of floats, optional &ensp; 對(duì)應(yīng)分布函數(shù)中的下界參數(shù) a,默認(rèn)為0。
high: float or array_like of floats &ensp; 對(duì)應(yīng)分布函數(shù)中的下界參數(shù) b,默認(rèn)為1.0。
size: int or tuple of ints, optional &ensp; 為輸出形狀大小,如果給定形狀為(m,n,k),那么m&times;n&times;k的樣本會(huì)從中抽取。默認(rèn)為None,即返回一個(gè)單一標(biāo)量。

返回:

out: ndarray or scalar &ensp; 從帶參數(shù)的均勻分布中采的隨機(jī)樣本

3.3 使用樣例

s = np.random.uniform(-1,0,10)
print(s)
# [-0.9479594  -0.86158902 -0.63754099 -0.0883407  -0.92845644 -0.11148294
#  -0.19826197 -0.77396765 -0.26809953 -0.74734785]

4. 狄利克雷(Dirichlet)分布

4.1 概率密度函數(shù)(pdf)

P(x;α)∝∏i=1kxαi?1ix=(x1,x2,...,xk),xi>0,∑i=1kxi=1α=(α1,α2,...,αk).αi>0

4.2 函數(shù)原型

random.dirichlet(alpha, size=None)

參數(shù):
alpha: sequence of floats, length k &ensp; 對(duì)應(yīng)分布函數(shù)中的參數(shù)向量 &alpha;,長度為k。
size: int or tuple of ints, optional &ensp; 為輸出形狀大小,因?yàn)椴沙龅拿總€(gè)樣本是一個(gè)隨機(jī)向量,默認(rèn)最后一維會(huì)自動(dòng)加上k,如果給定形狀為(m,n),那么m&times;n個(gè)維度為k的隨機(jī)向量會(huì)從中抽取。默認(rèn)為None,即返回一個(gè)一個(gè)k維的隨機(jī)向量。

返回:

out: ndarray &ensp; 采出的樣本,大小為(size,k)。

4.3 使用樣例

設(shè)&alpha;=(10,5,3)(意味著k=3),size=(2,2),則采出的樣本為2&times;2個(gè)維度為k=3的隨機(jī)向量。

s = np.random.dirichlet((10, 5, 3), size=(2, 2))
print(s)
# [[[0.82327647 0.09820451 0.07851902]
#   [0.50861077 0.4503409  0.04104833]]

#  [[0.31843167 0.22436547 0.45720285]
#   [0.40981943 0.40349597 0.1866846 ]]]

這個(gè)函數(shù)在論文[1]的實(shí)現(xiàn)代碼[2]中用來生成符合狄利克雷分布的權(quán)重向量

for cluster_id in range(n_clusters): 
    # 為每個(gè)client生成一個(gè)權(quán)重向量,文章中分布參數(shù)alpha每一維都相同
    weights = np.random.dirichlet(alpha=alpha * np.ones(n_clients))
    clients_counts[cluster_id] = np.random.multinomial(clusters_sizes[cluster_id], weights)

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python如何實(shí)現(xiàn)隨機(jī)采樣及概率分布”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI