熟悉常見概率分佈

paulquei發表於2018-11-20

生活中的很多事情潛在的都符合某種規律。例如:反覆拋擲一枚均勻的硬幣,出現正面和反面的機會是差不多的;我們認識的人裡面特別高或者特別矮的都不多,大部分人的身高都在一個比較接近的範圍內。概率論通過概率分佈來描述事件出現的頻率。本文選取了一些常見的概率分佈做一些介紹,以方便在今後使用的時候可以查閱。

當然,“常見”是一個很口語而非科學的說法,因為這很難有明確的標準。如果想要對更多的概率分佈做深入研究,請以文末的連結為起點進行更多探索。

基礎知識

為了便於描述,這裡我們先做一些基礎知識的介紹。

隨機變數

隨機變數是可以隨機地取不同值的變數。例如:拋擲一枚硬幣,出現正面或者反面的結果;從一個班級中,隨機選一個同學,他的身高值。

隨機變數可以是離散的或者連續的。離散隨機變數擁有有限(例如正面或者反面)或者可數無限多的狀態。連續隨機變數伴隨著實數值(例如:身高)。

概率質量函式

離散型變數的概率分佈可以用概率質量函式(Probability Mass Function,簡稱PMF)來描述。我們通常用大寫字母P來表示概率質量函式。

概率密度函式

當研究的物件是連續型隨機變數時,我們用概率密度函式(Probability Density Function,簡稱PDF)來描述它的概率分佈。我們通常用小寫字母p來描述概率密度函式。

期望

函式 $f(x)$ 關於某分佈的期望(Expectation)或者期望值(Expected value)是指:當x由P產生,f作用於x時,$f(x)$的平均值。

對於離散型隨機變數,期望值可以通過求和得到:

$$

E_{x sim P[f(x)]} = sum_xP(x)f(x)

$$

對於連續型隨機變數,期望值可以通過求積分得到:

$$

E_{x sim p[f(x)]} = int p(x)f(x) dx

$$

方差與標準差

方差(Variance)衡量的是當我們對x依據它的概率分佈進行取樣時,隨機變數x的函式值會呈現多大的差異。

計算方差的函式如下:

$$

Var(f(x)) = E[(f(x)-E[f(x)])^2]

$$

方差的平方根稱之為標準差(Standard Deviation)。有些資料也稱標準差為均方差

一幅圖理解期望和方差

臺灣大學李毅巨集教授的這節課程: 《Where does the error come from?》 僅僅通過一幅圖就非常好的解釋了期望和方差的概念。

結果與期望的偏離稱之為偏差(Bias)。通俗的講,Bias描述了結果與中心的偏離程度。而方差(Variance)描述了結果互相之間的雜湊程度。

你可以對比下面這幅圖的四種情況來加深理解:

bias_variance.png

從這幅圖中我們可以看出:

  • 當Bias和Variance都比較小的時候,結果都比較緊密的集中在預期的值上。
  • 當Bias較小而Variance較大時,意味著結果較靠近預期,但是比較散落。
  • 當Bias較大而Variance較小時,意味著結果集中在一起,但是離預期值偏離較多。
  • 當Bias和Variance都較大時,意味著結果既不靠近預期,也比較散落。

李毅巨集教授的課程是我目前發現的最好的機器學習資料,他的授課把那些複雜的概念,解釋的非常的清晰和通俗。

因此強烈推薦給大家。

李毅巨集教授的個人網站:李宏毅 (Hung-yi Lee)

李毅巨集教授的Youtube站點:Youtube:李宏毅

離散型分佈

伯努利分佈

伯努利(Bernoulli)分佈是最基本,也是我們最常見的分佈。這個名稱是為了紀念瑞士科學家雅各布·伯努利(Jakob I. Bernoulli)而命名。

伯努利分佈在生活中非常的常見。例如,拋擲一枚硬幣的結果就是符合伯努利分佈的:結果只會是正面或者反面。

下文將看到,好幾種其他的分佈都與伯努利分佈有一定的關係。

伯努利分佈亦稱“零一分佈”、“兩點分佈”:它的結果只會是兩種可能性中的一種,且這兩種結果互相對立,必居其一。因此,我們也常常稱結果是成功的,或者失敗的。

假設伯努利實驗成功的概率是p,則伯努利分佈的概率質量函式如下:

$$

P(X=x) = p^x (1 – p)^{(1-x)},; X in {0, 1}

$$

當然,考慮到X只有0和1兩種可能,我們也可以直接寫成:

$$

P(X=x) =
egin{cases}
p;(if,x=1) \
1-p;(if,x=0)
end{cases}

$$

伯努利分佈的期望值是p,方差是p(1-p)。

二項分佈

我們可以很自然的可以將一次伯努利實驗擴充套件到多次,此時其結果符合二項(Binomial)分佈

二項分佈的概率質量函式如下:

$$

P(X=k) = inom{n}{k}p^{k}(1-p)^{n-k}

$$

這裡的:

$$

inom{n}{k} = frac{n!}{k!(n-k)!}

$$

通過這個函式,我們可以計算出在進行n次的伯努利實驗中,有k次出現正面結果的概率。

很顯然,當n為1時,這個函式和伯努利的概率質量函式是一樣的。

二項分佈的期望值是np,方差是$np(1-p)$。

幾何分佈

幾何(Geometric)分佈也是進行多次的伯努利實驗。

它指的是:在n次伯努利試驗中,試驗k次才得到第一次成功的機率。或者說,就是:前k-1次皆失敗,第k次成功的概率。

幾何分佈的概率質量函式如下:

$$

P(X = k) = p(1-p)^{k – 1}

$$

幾何分佈的期望是$frac{1}{p}$,方差是$frac{(1-p)}{p^2}$。

多項分佈

進一步的,我們可以將二項分佈擴充套件到多項(Multinomial)分佈

多項分佈的結果有超過2種的更多種情況。例如:拋擲一枚骰子,其結果可能是1~6中的某個數值。

假設有$X_1$到$X_k$種結果,每種結果發生的概率是$p_1$到$p_k$,多項分佈的概率質量函式如下:

$$

P(X_1=n_1,…,X_k=n_k) = frac{n !}{n_1! … n_k !} p_1^{n_1} … p_k^{n_{k}} , ; (sum_{i=1}^k x_{i} = n)

$$

對於每個$X_{i}$來說,其數學期望是 $E(X_{i}) = np_{i}$,其方差是 $Var(X_{i}) = np_{i}(1-p_{i})$。

離散均勻分佈

特別地,當我們僅僅進行一次多項實驗,並且多項的各項結果是等可能的,那麼這個時候就得到的就是離散均勻(Discrete Uniform)分佈

其概率密度函式如下:

$$

P(X = x) = frac{1}{N} ; (x= 1,…,N)

$$

例如,拋擲一枚均勻的骰子,出現6個數中任意一個的概率都是 $frac{1}{6}$。

離散均勻分佈的期望值是 $frac{N+1}{2}$,方差是 $frac{(N+1)(N-1)}{12} $。

很顯然,上面幾種分佈都與伯努利分佈存在一定的關係,下面這幅圖描述了它們之間的關係:

bernoulli_related.png

泊松分佈

泊松(Poisson)分佈是另外一種很常見的概率分佈,由法國數學家西莫恩·德尼·泊松(Siméon-Denis Poisson)在1838年時發表。

我們可以回想一下,生活中很多事情都以特定頻率的反覆發生的,例如:

  • 某個醫院平均每天有100個新生兒;
  • 某個客服號碼每個小時會接到50個來電;
  • 某一班公交每個小時會5次經過其中一個站點;
  • 等等等等;

過去發生的平均頻度我們是可以計算的,但是我們永遠無法精確計算該事件下一次發生的時間點。

泊松分佈描述的是:在已知過去發生頻率的基礎上,預測在接下來一段特定的時間內,該事件發生特定次數的概率

這麼說有些拗口,但是接下來我們通過一個具體的例子就很容易理解了。

泊松分佈的概率質量函式如下:

$$

P(k) = frac{e^{-lambda}lambda^{k}}{k!} ; ,lambda ge 0

$$

這裡的e是一個常量,約等於2.71828。$lambda$是過去單位時間內發生的頻率,k是預測發生的次數。

以公交為例,假設我們知道過去它每個小時平均會5次經過其中一個站點($lambda$=5),那麼接下來的一個小時,它經過的次數很可能是4~6次。不太可能是1次或者10次。我們可以根據概率質量函式,計算它接下來一個小時分別經過1次,4次,5次,10次的概率。

  • 當k=1時:$P(1) = frac{e^{-5}5^{1}}{1!} approx 0.034 $
  • 當k=4時:$P(4) = frac{e^{-5}5^{4}}{4!} approx 0.175 $
  • 當k=5時:$P(5) = frac{e^{-5}5^{5}}{5!} approx 0.175 $
  • 當k=10時:$P(10) = frac{e^{-5}5^{10}}{10!} approx 0.018 $

當然,我們不用自己手算,藉助於Python的scipy.stats庫可以很輕鬆的計算出結果。

Python的scipy.stats庫包含了許多種分佈的許多相關函式。

藉助於matplotlib,我們甚至可以很輕鬆的將這個結果以圖形的方式展示出來。

下面這段程式碼,繪製了上面我們想要的結果:

import matplotlib.pyplot as plt
import numpy as np

from scipy.stats import poisson

x = np.arange(0, 11)
lamda = 5

plt.bar(x, poisson.pmf(x, lamda))

plt.text(8, 0.17, `lamda=5`)

plt.title(`Poisson Distribution`)
plt.show()

這段程式碼很簡單,這裡就不多做說明了。
網上有很多關於numpy和matplotlib的教程,也可以看我之前寫的文章:

另外,這篇文章也很值得一看:Plotting Distributions with matplotlib and scipy

下面這幅圖就是我們得到的結果。可以看到,這和我們前面計算的結果是一致的。

possion_dist.png

泊松分佈的期望值和方差都是$lambda$。

連續性分佈

高斯分佈

高斯(Gaussian)分佈又稱正態(Normal)分佈。這個概念是由德國的數學家和天文學家Moivre於1733年首次提出的,但由於德國數學家高斯率先將其應用於天文學家研究,故正態分佈又叫高斯分佈。

高斯分佈的概率密度函式曲線呈鐘形,因此人們又經常稱之為鐘形曲線。藉助於前面提到的幾個庫,我們可以很輕鬆的畫出高斯分佈的概率密度函式和累積分佈函式。

相關程式碼如下:

import matplotlib.pyplot as plt
import numpy as np

from scipy.stats import norm

x = np.linspace(-3, 3, 1000)

plt.plot(x, norm.pdf(x), label=`Probability density function`)
plt.plot(x, norm.cdf(x), label=`Cumulative distribution function`)

plt.legend()
plt.title(`Gaussian Distribution`)
plt.show()

得到的圖形如下:

norm_dist.png

從這個圖中我們可以看出,對於高斯分佈來說,隨機變數處於中間的概率是比較大的,而其取非常大或者非常小的值的概率都很小。我們現實中人們的身高,體重,收入等特點都符合這個模型。

高斯分佈的概率密度函式如下:

$$

f(x) = frac{1}{sqrt{2 pi}sigma}e^{-frac{(x – mu)^2}{2sigma^2}}

$$

對於符合高斯分佈的隨機變數,我們也經常記做下面這樣:

$$

X sim N(mu, sigma^2)

$$

在這個函式中,$mu$決定了高斯分佈的中心位置,$sigma$決定了鍾型曲線的胖瘦程度。實際上,$mu$就是高斯分佈的期望,而$sigma^2$就是方差。

當 $mu$ = 0,$sigma$ = 1時的,我們稱之為標準正態分佈。

上面我們看到的這個圖形就是標準正態分佈。

均勻分佈

均勻(Uniform)分佈要簡單很多,它指的就是:隨機變數在某個區間內,取任意一個值都是等可能的。

其概率密度函式如下:

$$

f(x) = frac{1}{b-a} , a le x le b

$$

很顯然,如果我們將這個函式畫成圖形,那就是兩個區間之間的一個水平線。

均勻分佈的期望值是 $frac{b+a}{2}$,方差是 $frac{(b-a)^2}{12}$。

指數分佈

指數(Exponential)分佈是描述泊松過程中的事件之間的時間的概率分佈,即事件以恆定平均速率連續且獨立地發生的過程。

指數分佈的概率密度函式如下:

$$

f(x) = frac{1}{lambda}e^{-frac{x}{lambda}} ; ,x ge 0, lambda gt 0

$$

指數分佈的期望是$lambda$,方差是$lambda^2$。

我們仍然是以前面提到的公交車為例。假設每個小時某班公交平均有5次會經過其中一個站點。

則可以通過下面這段程式碼繪製出其概率密度函式和分佈累積函式:

import matplotlib.pyplot as plt
import numpy as np

from scipy.stats import expon

x = np.linspace(0, 1, 1000)

lamda = 5
scale = 1/lamda

plt.plot(x, expon.pdf(x, scale=scale), label=`Probability density function`)
plt.plot(x, expon.cdf(x, scale=scale), label=`Cumulative distribution function`)

x1 = 0.2
x2 = 0.4
x3 = 1
y1 = expon.cdf(x1, scale=scale)
y2 = expon.cdf(x2, scale=scale)
y3 = expon.cdf(x3, scale=scale)

plt.scatter([x1, x2, x3], [y1, y2, y3], c="b")
plt.annotate("{:.3f}".format(y1), (x1, y1 + 0.2))
plt.annotate("{:.3f}".format(y2), (x2, y2 + 0.2))
plt.annotate("{:.3f}".format(y3), (x3, y3 + 0.2))

plt.legend()
plt.title(`Exponential Distribution`)
plt.show()

這段程式碼得到的圖形如下:

expon_dist.png

在這段程式碼中,我們特意的在0.2,0.4和1.0這三個點上做了標記。

從這個圖形中我們可以看出,對於這班公交來說,12分鐘(0.2小時)來車的概率是0.632,24分鐘(0.4小時)來車的概率是0.865。
當等待的時間越接近一個小時,新的一班車就幾乎肯定要來了。

結束語

這裡我們選取了一些常見的概率分佈介紹給大家。這些分佈可能是我們在做機器學習時會用到的。

文章的開頭也提到,“常見”是一個沒有標準的定義,也許後面我還會繼續擴充這篇文章,加入更多的內容。

如果你覺得有什麼很合適加入的內容,也可以給我留言。

參考資料與推薦讀物


相關文章