概率分布的python實現


接上篇概率分布,這篇文章講概率分布在python的實現。

文中的公式使用LaTex語法,即在\begin{equation}至\end{equation}的內容可以在https://www.codecogs.com/latex/eqneditor.php?lang=zh-cn頁面轉換出
正確的格式

二項分布(Binomial Distribution)

包含n個相同的試驗
每次試驗只有兩個可能的結果:“成功”或“失敗”。
出現成功的概率p對每一次試驗是相同的,失敗的概率q也是如此,且p+q=1。
試驗是互相獨立的。
試驗成功或失敗可以計數,即試驗結果對應於一個離散型隨機變量。

以X表示n次重復獨立試驗中事件A(成功)出現的次數,則

\begin{equation}
P{X=x}=C_{n}^{x} p^{x} q^{n-x}, \quad x=0,1,2, \cdots, n
\end{equation}

在python中,可以使用scipy.stats模塊中的binom.rvs()方法生成符合二項分布的離散隨機變量。該方法的參數n表示n次重復獨立試驗,p表示事件A出現的次數。size表示做多少次二項分布試驗。

同時,本文中使用seaborn的distplot方法繪制隨機變量分布的直方圖。在大數據量的試驗下,通過隨機變量出現的頻率除以試驗的次數,可以得到特定離散隨機變量出現的概率。

from scipy.stats import binom
import seaborn as sns
data_binom = binom.rvs(n=10,p=0.5,size=10000)
ax = sns.distplot(data_binom,
                  kde=False,
                  color='green',
                  hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Binomial Distribution', ylabel='Frequency')

bimomial_distribution

# 可以打印隨機變量的值,按照定義,其值為出現A事件的次數,范圍肯定在[0,1]
print(data_binom)
[2 3 6 ... 5 4 3]

以拋硬幣試驗解析上圖,得出連續拋10次硬幣,5次為正面的概率最高,概率趨近於2500/10000=25%。

貝努里分布(Bernoulli Distribution)

貝努里分布為特殊的二項分布,即每次執行一次試驗(n=1),然后獲取單次試驗的隨機變量的值,為0或1。所以貝努里分布也被稱為0-1分布。其分布函數為:

\begin{equation}
P{X=x}=p^{x} q^{1-x}, \quad x=0,1
\end{equation}

在python中,可以使用scipy.stats模塊中的bernoulli.rvs()方法生成符合二項分布的離散隨機變量。其它參數同二項分布。

from scipy.stats import bernoulli
data_bern = bernoulli.rvs(size=10000,p=0.5)
ax= sns.distplot(data_bern,
                 kde=False,
                 color="green",
                 hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Bernoulli Distribution', ylabel='Frequency')

bernoulli_distribution

以拋硬幣試驗解析上圖,得出正面和反面出現的概率,趨近於5000/10000=50%。

幾何分布(Geometric distribution)

幾何分布是指在n次貝努里試驗中,經過k次獲得1次成功的概率。

 幾何分布的特點:
(1)進行一系列相互獨立的試驗;
(2)每一次試驗既有成功的可能,也有失敗的可能,且單次試驗的成功概率相同;
(3)主要是為了取得第一次成功需要進行多少次試驗。

其分布函數為:

\begin{equation}
P{X=k}=p (1-p)^{k-1}, \quad k \geqslant 1
\end{equation}

在python中,可以使用scipy.stats模塊中的geom.rvs()方法得出幾何分布的離散隨機變量。

from scipy.stats import geom
data_geom = geom.rvs(size=10000,p=0.5)
ax= sns.distplot(data_geom,
                 kde=False,
                 color="green",
                 hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Geometric Distribution', ylabel='Frequency')

geometric_distribution

泊松分布(Poisson distribution)

泊松分布是用來描述在一指定時間范圍內或在指定的面積或體積之內某一事件出現的次數的分布,例如某企業每月發生事故的次數。

泊松分布的公式為:

\begin{equation}
P(X)=\frac{\lambda^{x} \mathrm{e}^{-\lambda}}{x !}, \quad x=0,1,2, \cdots
\end{equation}
式中,\(\lambda\)為給定的時間間隔內事件的平均數。

在python中,可以使用scipy.stats模塊中的poisson.rvs()方法得出泊松分布的連續隨機變量。其中參數mu即為公式中的\(\lambda\),其它參數同上文方法。

from scipy.stats import poisson
data_poisson = poisson.rvs(mu=3, size=10000)
ax = sns.distplot(data_poisson,
                  bins=30,
                  kde=False,
                  color="green",
                  hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Poisson Distribution', ylabel='Frequency')

poisson_distribution

正態分布(Normal Distribution)

在連續型隨機變量中,最重要的一種隨機變量是具有鍾形概率分布的隨機變量。人們稱它為正態隨機變量,相應的概率分布稱為正態分布。

如果隨機變量X的概率密度為:
\begin{equation}
f(x)=\frac{1}{\sigma \sqrt{2 \pi}} \mathrm{e}^{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}}, \quad-\infty<x<+\infty
\end{equation}

則稱X服從正態分布,記作\(X \sim N\left(\mu, \sigma^{2}\right)\),其中,\(-\infty< \mu <+\infty\)\(\sigma > 0\), \(\mu\)為隨機變量X的均值,\(\sigma​\)為隨機變量X的標准差,它們是正態分布的兩個參數。

在python中,可以使用scipy.stats模塊中的norm.rvs()方法產生符合二項分布的連續隨機變量。其中參數loc代表隨機變量的均值,size變量代表隨機變量的標准差。

from scipy.stats import norm
# 生成標准正態分布,N(0,1)
data_normal = norm.rvs(size=10000,loc=0,scale=1)
ax = sns.distplot(data_normal,
                  bins=100,
                  kde=True,
                  color="green",
                  hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Normal Distribution', ylabel='Frequency')

normal_distribution

總結

本文通過scipy.stats包中的隨機分布函數rvs方法(Random variates),執行10000次隨機變量的計算,通過隨機變量值個數直方圖的繪制得出特定分布的圖形。
另外,也可以通過隨機分布函數的pmf方法直接獲得指定參數下的概率值,然后畫出參數與概率的對應關系,但在本文中不做展開。

歡迎掃描二維碼關注公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM