Python隨機(jī)采樣及概率分布(二)
前言:
之前的《Python中的隨機(jī)采樣和概率分布》我們介紹了Python中最簡單的隨機(jī)采樣函數(shù)。接下來我們更進(jìn)一步,來看看如何從一個概率分布中采樣,我們以幾個機(jī)器學(xué)習(xí)中最常用的概率分布為例。
1. 二項(xiàng)(binomial)/伯努利(Bernoulli)分布
1.1 概率質(zhì)量函數(shù)(pmf)
二項(xiàng)分布P(X=x; n, p)可以表示進(jìn)行獨(dú)立重復(fù)試驗(yàn)n次,每次有兩成功和失敗可能結(jié)果(分別對應(yīng)概率p和1−p),共成功x次的概率。
1.2 函數(shù)原型
random.binomial(n, p, size=None)
參數(shù):
n
: int or array_like of ints 對應(yīng)分布函數(shù)中的參數(shù) n,>=0,浮點(diǎn)數(shù)會被截?cái)酁檎巍?br />p
: float or array_like of floats 對應(yīng)分布函數(shù)參數(shù)p, >=0并且<=1。size
: int or tuple of ints, optional 如果給定形狀為(m,n,k),那么m×n×k個隨機(jī)樣本會從中抽取。默認(rèn)為None,即返回一個一個標(biāo)量隨機(jī)樣本。
返回:
out
: ndarray or scalar 從帶參數(shù)的概率分布中采的隨機(jī)樣本,每個樣本表示獨(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個樣本。
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周圍上下波動。
我們來看一個有趣的例子。一家公司鉆了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,這個概率還是蠻大的。
2. 多項(xiàng)(multinomial)分布
2.1 概率質(zhì)量函數(shù)(pmf)
也就是說,多項(xiàng)分布式二項(xiàng)分布的推廣:仍然是獨(dú)立重復(fù)實(shí)驗(yàn)n次,但每次不只有成功和失敗兩種結(jié)果,而是k種可能的結(jié)果,每種結(jié)果的概率為pi。多項(xiàng)分布是一個隨機(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 對應(yīng)分布函數(shù)中的參數(shù) n。pvals
: sequence of floats 對應(yīng)分布函數(shù)參數(shù)p, 其長度等于可能的結(jié)果數(shù)k,并且有0?pi?1。size
: int or tuple of ints, optional 為輸出形狀大小,因?yàn)椴沙龅拿總€樣本是一個隨機(jī)向量,默認(rèn)最后一維會自動加上k,如果給定形狀為(m,n),那么m×n個維度為k的隨機(jī)向量會從中抽取。默認(rèn)為None,即返回一個一個k維的隨機(jī)向量。
返回:
out
: ndarray 從帶參數(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個樣本。
s = np.random.multinomial(20, [1/6.]*6, size=1) print(s) # [[4 2 2 3 5 4]]
當(dāng)然,如果不指定size
,它直接就會返回一個一維向量了
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]]]
這個函數(shù)在論文<sup>[1]</sup>的實(shí)現(xiàn)代碼<sup>[2]</sup>中用來設(shè)置每一個 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ù)返回骰子落在某個client上各多少次,也就對應(yīng)著該client應(yīng)該分得的樣本數(shù)
3.均勻(uniform)分布
3.1 概率密度函數(shù)(pdf)
均勻分布可用于隨機(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 對應(yīng)分布函數(shù)中的下界參數(shù) a,默認(rèn)為0。high
: float or array_like of floats 對應(yīng)分布函數(shù)中的下界參數(shù) b,默認(rèn)為1.0。size
: int or tuple of ints, optional 為輸出形狀大小,如果給定形狀為(m,n,k),那么m×n×k的樣本會從中抽取。默認(rèn)為None,即返回一個單一標(biāo)量。
返回:
out
: ndarray or scalar 從帶參數(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 對應(yīng)分布函數(shù)中的參數(shù)向量 α,長度為k。size
: int or tuple of ints, optional 為輸出形狀大小,因?yàn)椴沙龅拿總€樣本是一個隨機(jī)向量,默認(rèn)最后一維會自動加上k,如果給定形狀為(m,n),那么m×n個維度為k的隨機(jī)向量會從中抽取。默認(rèn)為None,即返回一個一個k維的隨機(jī)向量。
返回:
out
: ndarray 采出的樣本,大小為(size,k)。
4.3 使用樣例
設(shè)α=(10,5,3)(意味著k=3),size=(2,2),則采出的樣本為2×2個維度為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 ]]]
這個函數(shù)在論文[1]的實(shí)現(xiàn)代碼[2]中用來生成符合狄利克雷分布的權(quán)重向量
for cluster_id in range(n_clusters):? ? ? # 為每個client生成一個權(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)
到此這篇關(guān)于Python隨機(jī)采樣及概率分布(二)的文章就介紹到這了,更多相關(guān)Python隨機(jī)采樣及概率分布內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型解析
這篇文章主要介紹了pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07實(shí)例講解Python中g(shù)lobal語句下全局變量的值的修改
global是Python中的一個關(guān)鍵字用來,聲明一個局部變量為全局變量,這里我們來以實(shí)例講解Python中g(shù)lobal語句下全局變量的值的修改,需要的朋友可以參考下.2016-06-06pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式
這篇文章主要介紹了pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Python 調(diào)用 Outlook 發(fā)送郵件過程解析
這篇文章主要介紹了Python 調(diào)用 Outlook 發(fā)送郵件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)快速文件格式批量轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)快速文件格式批量轉(zhuǎn)換的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Python實(shí)現(xiàn)數(shù)據(jù)清洗的示例詳解
這篇文章主要通過五個示例帶大家深入了解下Python實(shí)現(xiàn)數(shù)據(jù)清洗的具體方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-08-08