【数学基础】从零构建统计随机变量生成器之离散基础篇
在本系列中,我們會從第一性原理出發,從零開始構建統計學中的常見分布的隨機變量生成器,包括二項分布,泊松分布,高斯分布等。在實現這些基礎常見分布的過程中,會展示如何使用統計模擬的通用技術,包括 inverse CDF,Box-Muller,分布轉換等。本期通過伯努利試驗串聯起來基礎離散分布并通過代碼來實現這些分布的生成函數,從零開始構建的原則是隨機變量生成器實現只依賴 random() 產生 [0, 1.0] 之間的浮點數,不依賴于其他第三方API來完成。
均勻分布(離散)
離散均勻分布(Discrete Uniform Distribution)的隨機變量是最為基本的,圖中為 [0, 6] 七個整數的離散均勻分布。算法實現為,使用 [0, 1] 之間的隨機數 u,再將 u 等比例擴展到指定的整數上下界。
實現代碼
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
持續模擬動畫
伯努利分布
伯努利分布(Bernoulli Distribution)是support為0或者1的離散分布,0和1可以看成失敗和成功兩種可能。伯努利分布指定了成功的概率p,例如,下圖是 p=0.4 的伯努利分布。
?伯努利分布隨機數實現也很直接,將隨機值 u 根據 p 決定成功或者失敗。
實現代碼
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
持續模擬動畫
類別分布
類別分布(Categorical Distribution)是在伯努利分布的基礎上擴展到了多個點,每個點同樣由參數指定了其概率,因此,其參數從 p 擴展到了向量 ,如圖所示為 時的類別分布。
?實現代碼
類別分布生成函數也擴展了伯努利分布的實現算法,將隨機數 u 和累計概率向量作比較。在這個例子中, 轉換成 ,再將 u 和 數組匹配,返回結果為第一個大于 u 的元素 index。實現上,我們可以以線性復雜度遍歷數組,更好一點的方法是,用 python bisect函數通過二分法找到index,將時間復雜度降到 。
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
持續模擬動畫
二項分布
二項分布(Binomial Distribution)有兩個參數 n 和 p,表示伯努利實驗做n次后成功的次數。圖中為 n=6,p=0.5的二項分布。
?實現代碼
二項分布生成算法可以通過伯努利試驗的故事來實現,即調用 n 次伯努利分布生成函數,返回總的成功次數。
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
概率質量函數(PMF)
持續模擬動畫
幾何分布
幾何分布(Geometric Distribution)和伯努利實驗的關系是:幾何分布是反復伯努利實驗直至第一次成功時的失敗次數。如圖,當成功概率 p=0.4時的幾何分布。
?實現代碼
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
概率質量函數(PMF)
持續模擬動畫
負二項分布
負二項分布(Negative Binomial Distribution)是嘗試伯努利試驗直至成功 r 次的失敗次數。
?實現代碼
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
概率質量函數(PMF)
持續模擬動畫
超幾何分布
超幾何分布(HyperGeometric Distribution)的意義是從總數為N的集合抽取n次后成功的次數。具體來說,集合由K個表示成功的元素和N-K個表示失敗的元素組成,并且抽取時沒有替換(without replacement)情況下的成功次數。注意,超幾何分布和二項分布的區別僅在于有無替換。
?實現代碼
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
概率質量函數(PMF)
持續模擬動畫
負超幾何分布
負超幾何分布(Negative Hypergeometric Distribution)的意義是從總數為N的集合中,無替換下抽取直至 r 次失敗時,成功的次數。
?實現代碼
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
概率質量函數(PMF)
持續模擬動畫
伯努利試驗總結
下表總結了上面四種和伯努利試驗有關的離散分布的具體區別。
| 固定嘗試次數 | 二項 Binomial | 超幾何 Hypergeometric |
| 固定成功次數 | 負二項 Negative Binomial | 負超幾何 Negative Hypergeometric |
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的【数学基础】从零构建统计随机变量生成器之离散基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】数据项目总结 --
- 下一篇: 【Python基础】安利3个Python