【数学基础】从零构建统计随机变量生成器之离散基础篇
在本系列中,我們會(huì)從第一性原理出發(fā),從零開始構(gòu)建統(tǒng)計(jì)學(xué)中的常見分布的隨機(jī)變量生成器,包括二項(xiàng)分布,泊松分布,高斯分布等。在實(shí)現(xiàn)這些基礎(chǔ)常見分布的過程中,會(huì)展示如何使用統(tǒng)計(jì)模擬的通用技術(shù),包括 inverse CDF,Box-Muller,分布轉(zhuǎn)換等。本期通過伯努利試驗(yàn)串聯(lián)起來基礎(chǔ)離散分布并通過代碼來實(shí)現(xiàn)這些分布的生成函數(shù),從零開始構(gòu)建的原則是隨機(jī)變量生成器實(shí)現(xiàn)只依賴 random() 產(chǎn)生 [0, 1.0] 之間的浮點(diǎn)數(shù),不依賴于其他第三方API來完成。
均勻分布(離散)
離散均勻分布(Discrete Uniform Distribution)的隨機(jī)變量是最為基本的,圖中為 [0, 6] 七個(gè)整數(shù)的離散均勻分布。算法實(shí)現(xiàn)為,使用 [0, 1] 之間的隨機(jī)數(shù) u,再將 u 等比例擴(kuò)展到指定的整數(shù)上下界。
實(shí)現(xiàn)代碼
import?random from?math?import?floordef?uniform(a:?int,?b:?int)?->?int:assert?a?<=?bu?=?random.random()return?a?+?floor((b?-?a?+?1)?*?u)Github 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_uniform.py
持續(xù)模擬動(dòng)畫
伯努利分布
伯努利分布(Bernoulli Distribution)是support為0或者1的離散分布,0和1可以看成失敗和成功兩種可能。伯努利分布指定了成功的概率p,例如,下圖是 p=0.4 的伯努利分布。
?伯努利分布隨機(jī)數(shù)實(shí)現(xiàn)也很直接,將隨機(jī)值 u 根據(jù) p 決定成功或者失敗。
實(shí)現(xiàn)代碼
import?randomdef?bernoulli(p:?float)?->?int:assert?0?<=?p?<=?1u?=?random.random()return?1?if?u?<=?p?else?0Github 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_bernoulli.py
持續(xù)模擬動(dòng)畫
類別分布
類別分布(Categorical Distribution)是在伯努利分布的基礎(chǔ)上擴(kuò)展到了多個(gè)點(diǎn),每個(gè)點(diǎn)同樣由參數(shù)指定了其概率,因此,其參數(shù)從 p 擴(kuò)展到了向量 ,如圖所示為 時(shí)的類別分布。
?實(shí)現(xiàn)代碼
類別分布生成函數(shù)也擴(kuò)展了伯努利分布的實(shí)現(xiàn)算法,將隨機(jī)數(shù) u 和累計(jì)概率向量作比較。在這個(gè)例子中, 轉(zhuǎn)換成 ,再將 u 和 數(shù)組匹配,返回結(jié)果為第一個(gè)大于 u 的元素 index。實(shí)現(xiàn)上,我們可以以線性復(fù)雜度遍歷數(shù)組,更好一點(diǎn)的方法是,用 python bisect函數(shù)通過二分法找到index,將時(shí)間復(fù)雜度降到 。
import?bisect import?random from?typing?import?Listdef?categorical(probs:?List[float])?->?int:assert?abs(sum(probs)?-?1.0)?<?0.001cum?=?probs.copy()for?i?in?range(1,?len(cum)):cum[i]?=?cum[i-1]?+?probs[i]u?=?random.random()return?bisect.bisect(cum,?u)Github 代碼地址:https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_categorical.py
持續(xù)模擬動(dòng)畫
二項(xiàng)分布
二項(xiàng)分布(Binomial Distribution)有兩個(gè)參數(shù) n 和 p,表示伯努利實(shí)驗(yàn)做n次后成功的次數(shù)。圖中為 n=6,p=0.5的二項(xiàng)分布。
?實(shí)現(xiàn)代碼
二項(xiàng)分布生成算法可以通過伯努利試驗(yàn)的故事來實(shí)現(xiàn),即調(diào)用 n 次伯努利分布生成函數(shù),返回總的成功次數(shù)。
def?binomial(n:?int,?p:?float)?->?int:return?sum(bernoulli(p)?for?_?in?range(n))Github 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_binomial.py
概率質(zhì)量函數(shù)(PMF)
持續(xù)模擬動(dòng)畫
幾何分布
幾何分布(Geometric Distribution)和伯努利實(shí)驗(yàn)的關(guān)系是:幾何分布是反復(fù)伯努利實(shí)驗(yàn)直至第一次成功時(shí)的失敗次數(shù)。如圖,當(dāng)成功概率 p=0.4時(shí)的幾何分布。
?實(shí)現(xiàn)代碼
from?discrete_bernoulli?import?bernoullidef?geometric(p:?float)?->?int:fail_num?=?0while?not?bernoulli(p):fail_num?+=?1return?fail_numGithub 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_geometric.py
概率質(zhì)量函數(shù)(PMF)
持續(xù)模擬動(dòng)畫
負(fù)二項(xiàng)分布
負(fù)二項(xiàng)分布(Negative Binomial Distribution)是嘗試伯努利試驗(yàn)直至成功 r 次的失敗次數(shù)。
?實(shí)現(xiàn)代碼
from?discrete_bernoulli?import?bernoullidef?negative_binomial(r:?int,?p:?float)?->?int:failures?=?0while?r:success?=?bernoulli(p)if?success:r?-=?1else:failures?+=?1return?failuresGithub 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_nagative_binomial.py
概率質(zhì)量函數(shù)(PMF)
持續(xù)模擬動(dòng)畫
超幾何分布
超幾何分布(HyperGeometric Distribution)的意義是從總數(shù)為N的集合抽取n次后成功的次數(shù)。具體來說,集合由K個(gè)表示成功的元素和N-K個(gè)表示失敗的元素組成,并且抽取時(shí)沒有替換(without replacement)情況下的成功次數(shù)。注意,超幾何分布和二項(xiàng)分布的區(qū)別僅在于有無替換。
?實(shí)現(xiàn)代碼
from?discrete_bernoulli?import?bernoullidef?hypergeometric(N:?int,?K_succ_num:?int,?n_trial_num:?int)?->?int:x?=?N?-?K_succ_numn_hit?=?0while?n_trial_num:hit?=?bernoulli(K_succ_num?/?(K_succ_num?+?x))n_hit?+=?hitif?hit:K_succ_num?-=?1else:x?-=?1if?K_succ_num?==?0:return?n_hitn_trial_num?-=?1return?n_hitGithub 代碼地址:
https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_hypergeometric.py
概率質(zhì)量函數(shù)(PMF)
持續(xù)模擬動(dòng)畫
負(fù)超幾何分布
負(fù)超幾何分布(Negative Hypergeometric Distribution)的意義是從總數(shù)為N的集合中,無替換下抽取直至 r 次失敗時(shí),成功的次數(shù)。
?實(shí)現(xiàn)代碼
from?discrete_bernoulli?import?bernoullidef?negative_hypergeometric(N:?int,?K_success_num:?int,?r_fail_times:?int)?->?int:fail_num?=?N?-?K_success_numsucc_trials?=?0while?r_fail_times:success?=?bernoulli(K_success_num?/?(K_success_num?+?fail_num))if?success:K_success_num?-=?1succ_trials?+=?1if?K_success_num?==?0:?#?no?more?success?elementsreturn?succ_trialselse:fail_num?-=?1r_fail_times?-=?1return?succ_trialsGithub 代碼地址:https://github.com/MyEncyclopedia/stats_simulation/blob/main/distrib_sim/discrete_negative_hypergeometric.py
概率質(zhì)量函數(shù)(PMF)
持續(xù)模擬動(dòng)畫
伯努利試驗(yàn)總結(jié)
下表總結(jié)了上面四種和伯努利試驗(yàn)有關(guān)的離散分布的具體區(qū)別。
| 固定嘗試次數(shù) | 二項(xiàng) Binomial | 超幾何 Hypergeometric |
| 固定成功次數(shù) | 負(fù)二項(xiàng) Negative Binomial | 負(fù)超幾何 Negative Hypergeometric |
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的【数学基础】从零构建统计随机变量生成器之离散基础篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】数据项目总结 --
- 下一篇: 【机器学习基础】算法工程师必备的机器学习