例項複習機器學習數學 - 2. 幾種典型離散隨機變數分佈

乾貨滿滿張雜湊發表於2021-07-14

隨機變數的引入

上一節我們討論的都是隨機事件,某一個隨機事件可能包含若干個隨機試驗樣本空間中的隨機結果,如果對於每一個可能的實驗結果都關聯一個特定的值,這樣就形成了一個隨機變數

例如拋一個骰子,將丟擲的骰子的值作為隨機變數的值;足球比賽,將某一隻球隊進球的個數作為隨機變數的值;拋一根標槍,丟擲的距離作為隨機變數的值;今年一年的降水量作為隨機變數等等。

離散型隨機變數相關概念

隨機變數的取值並不是連續的,而是有限個數值,或者是可以計數的無限個數值,這樣的隨機變數被稱為離散隨機變數。回顧一下上面提出的四個例子,投一個骰子,將丟擲的骰子的值作為隨機變數的值,這些值只可能是 1,2,3,4,5,6,所以是離散隨機變數分佈;足球比賽,將某一隻球隊進球的個數作為隨機變數的值,這個進球數可能是無限個,只不過數值很大的時候概率很低而已,這也是離散隨機變數分佈。但是對於拋一根標槍,丟擲的距離作為隨機變數的值和今年一年的降水量作為隨機變數這些是無法計數的,被稱為連續隨機變數

對於離散隨機變數,搞清楚每個值的概率也是很重要的,將隨機變數的每個值對映到其概率上,這就是概率質量函式(PMF).記隨機變數為 \(X\),PMF 為 \(P(X=k)\)。接下來,我們就來詳細說明幾種典型的隨機變數以及其概率質量函式。

只有兩種可能的多次實驗分佈 - 二項分佈

我們有如下幾個例子:

  • 射門 n 次,假設進球概率為\(p\),每次射門彼此之間都是相互獨立的,隨機變數 \(X\) 對應 n 次射門進球的次數。
  • 投一個硬幣 n 次,假設正面朝上的概率為 \(p\),每次拋擲彼此之間都是相互獨立的,隨機變數 \(X\) 對應 n 次拋擲得到的是正面的次數。
  • 坐某個航班的飛機,假設準點到達的概率為\(p\),每次這個航班到達彼此之間都是相互獨立的,隨機變數 \(X\) 對應 n 次航班準點的次數。

以上這些例子中,都可以理解為在同樣的條件下重複地、相互獨立地進行的一種隨機試驗,其特點是該隨機試驗只有兩種可能:發生或者不發生。我們假設該項試驗獨立重複地進行了 n 次,那麼就稱這一系列重複獨立的隨機試驗為 n 重伯努利試驗。n 重伯努利試驗結果的分佈就是二項分佈

二項分佈的 PMF為:

\[P(X = k) = C_n^kp^k(1-p)^{n-k} \]

根據 PMF 推導期望與方差,假設伯努利實驗的隨機變數只有兩個值 0(不發生),1(發生),那麼 n 次試驗的期望為:

\[E[X] = 1C_n^1p(1-p)^{n-1} + 2C_n^2p^2(1-p)^{n-2} + ... + (n-1)C_n^{n-1}p^{n-1}(1-p) + nC_n^np^{n} \]

根據 \(kC_n^k = nC_{n-1}^{k-1}\),則有:

\[E[X] = nC_{n-1}^0p(1-p)^{n-1} + nC_{n-1}^1p^2(1-p)^{n-2} + ... + nC_{n-1}^{n-2}p^{n-1}(1-p) + nC_n^np^{n} \]

\[= np(C_{n-1}^0(1-p)^{n-1} + C_{n-1}^1p^1(1-p)^{n-2} + ... + C_{n-1}^{n-2}p^{n-2}(1-p) + C_n^np^{n-1}) \]

\[= np\sum_{k=0}^{n-1}C_{n-1}^{n-1-k}p^k(1-p)^{n-1-k} \]

根據 $(p+q)^n = C_n0pnq^0 + C_n1p{n-1}q^{1} +... + C_n{n-1}p{1}q^{n-1} + C_nnp0q^n = \sum_{k=0}{n}C_{n}{n-k}p{n-k}qk $,則有:

\[E[X] = np(1-p + p)^{n-1} = np \]

n 次試驗的方差為:

\[D[X] = E(X - E[X])^2 = E[X^2 - 2xE[X] + E[X]^2] = E[X^2] - 2E[X]E[X] + E[X]^2 = E[X^2] - E[X]^2 \]

其中 \(E[X^2]\)

\[E[X^2] = 1^2C_n^1p(1-p)^{n-1} + 2^2C_n^2p^2(1-p)^{n-2} + ... + (n-1)^2C_n^{n-1}p^{n-1}(1-p) + n^2C_n^np^{n} \]

\[= \sum_{k=0}^{n}k^2C_n^kp^k(1-p)^{n-k} \]

根據 \(k^2C_n^k = knC_{n-1}^{k-1} = (k - 1 + 1)nC_{n-1}^{k-1} = n(k - 1)C_{n-1}^{k-1} + nC_{n-1}^{k-1} = n(n-1)C_{n-2}^{k-2} + nC_{n-1}^{k-1}\),則有:

\[E[X^2] = n(n-1)\sum_{k=0}^{n}C_{n-2}^{k-2}p^k(1-p)^{n-k} + n\sum_{k=0}^{n}C_{n-1}^{k-1}p^k(1-p)^{n-k} \]

\(k + j = n\),則有:

\[E[X^2] = n(n-1)\sum_{j=0}^{n}C_{n-2}^{n-j-2}p^{n-j}(1-p)^{j} + n\sum_{j=0}^{n}C_{n-1}^{n-j-1}p^{n-j}(1-p)^{j} \]

\[=n(n-1)p^2\sum_{j=0}^{n}C_{n-2}^{n-j-2}p^{n-j-2}(1-p)^{j} + np\sum_{j=0}^{n}C_{n-1}^{n-j-1}p^{n-j-1}(1-p)^{j} \]

\[=n(n-1)p^2(p+1-p)^{n-2} + np(p+1-p)^{n-1} = n(n-1)p^2 + np \]

則:

\[E[X^2] - E[X]^2 = n(n-1)p^2 + np - n^2p^2 = n^2p^2 - np^2 + np - n^2p^2 = np - np^2 = np(1-p) \]

接下來我們通過一個小程式來直觀感受下二項分佈:

from scipy.stats import binom
import matplotlib.pyplot as plt
import numpy as np
import seaborn
#我個人比較喜歡這個主題
seaborn.set_style("whitegrid")
#使用內建庫 binom 模擬 n = 10, p = 0.3 的情況,隨機 100000 次
binom_sim = data = binom.rvs(n=10, p=0.3, size=100000)
#計算本次平均值以及標準差
print ("Mean: %g" % np.mean(binom_sim))
print ("Std: %g" % np.std(binom_sim, ddof=1))
#繪圖,利用歸一化的直方圖,這樣展示的很接近概率質量函式
plt.hist(binom_sim, bins=10, density=True, stacked=True)
plt.show()

可以看到輸出為:

image

可以看到平均值很接近期望,標準差也是很接近我們用公式算出來的方差開根。

發生概率與試驗次數相比很小的二項分佈 - 泊松分佈

當 n 比較大, p 比較小的時候,二項分佈可以近似為 泊松分佈

由此可以推匯出,泊松分佈的期望方差為:

\[E[X] = np = \lambda \]

\[D[X] = np(1-p) = np * 1 = np = \lambda \]

泊松分佈的 PMF 為:

\[P(X = k) = \lim_{n \to \infty, p \to 0}C_n^kp^k(1-p)^{n-k} = \lim_{n \to \infty, p \to 0} \frac{n(n-1)...(n-k+1)}{k!}p^k(1-p)^(n-k) \]

\[= \lim_{n \to \infty, p \to 0} \frac{n(n-1)...(n-k+1)}{k!}(\frac{\lambda/n})^k(1-\lambda/n)^(n-k) \]

分別來看每一部分:

\[\lim_{n \to \infty, p \to 0} \frac{n(n-1)...(n-k+1)}= n^k \]

由於 n 趨近於無窮,所以

\[\lim_{n \to \infty}(1+\frac{x}{n})^n=e^x \]

所以有:

\[\lim_{n \to \infty, p \to 0}(1-\lambda/n)^n = e^{-\lambda} \]

最後:

\[\lim_{n \to \infty, p \to 0}(1-\lambda/n)^k = 1^k = 1 \]

合併帶入:

\[\lim_{n \to \infty, p \to 0} \frac{n(n-1)...(n-k+1)}{k!}(\frac{\lambda/n})^k(1-\lambda/n)^(n-k) \]

\[= \lim_{n \to \infty, p \to 0}\frac{n^k}{k!}\frac{\lambda^k}{n^k}e^{-\lambda} \]

\[= \frac{\lambda^k}{k!}e^{-\lambda} \]

為何要近似為泊松分佈呢?在生活中我們會根據歷史資料來預測結果,同時有很多事件可以抽象為泊松分佈,例如:

  • 預測兩隻球隊的勝平負結果,可以通過預測兩隻球隊的進球情況。可以將兩隻球隊進球概率設為 p,每次射門就是一次獨立重複隨機試驗,那麼這個試驗結果應該符合二項分佈。但是,預測進球概率是很難的,但是,我們可以通過歷史資料來算出來這個球隊的平均進球數,也就是 λ。同時,進球概率相對於射門次數來說,也是比較小的,可以近似為泊松分佈。這樣,我們就能通過泊松分佈以及 λ 來計算出進 k 個球的概率。取兩個球隊進球數的概率分佈列,計算勝平負結果的概率。
  • 預測當天飛機晚點的次數。同樣的,晚點概率相對於航班次數來說,是很小的,並且,晚點概率我們很難預測,但是可以通過歷史資料得出平均晚點次數,抽象為泊松分佈就可以算出晚點次數為 k 的概率。

對於這種,推測概率很難,但是可以通過歷史資料描述其期望的,我們一般通過抽象為泊松分佈來計算它的先驗概率。

接下來我們繼續通過程式模擬:

from scipy.stats import poisson
import matplotlib.pyplot as plt
import numpy as np
import seaborn
#我個人比較喜歡這個主題
seaborn.set_style("whitegrid")
#使用內建庫 poisson 模擬 λ=5 的情況,隨機 10000 次
poisson_sim = poisson.rvs(mu=5, size=10000)
#計算本次平均值以及標準差
print ("Mean: %g" % np.mean(poisson_sim))
print ("Std: %g" % np.std(poisson_sim, ddof=1))
#繪圖,利用歸一化的直方圖,這樣展示的很接近概率質量函式
plt.hist(poisson_sim, density=True, stacked=True)
plt.gca().axes.set_xticks(range(0, 11))
plt.show()

輸出為:
image

直到事件發生為止的分佈 - 幾何分佈

類比二項分佈的例子,我們稍微做下修改:

  • 射門 n 次,假設進球概率為\(p\),每次射門彼此之間都是相互獨立的,直到射門射進為止,隨機變數 \(X\) 對應射門進球是第幾次。
  • 投一個硬幣 n 次,假設正面朝上的概率為 \(p\),每次拋擲彼此之間都是相互獨立的,直到丟擲的硬幣是正面為止,隨機變數 \(X\) 對應拋擲得到的是正面是第幾次。
  • 坐某個航班的飛機,假設準點到達的概率為\(p\),每次這個航班到達彼此之間都是相互獨立的,隨機變數 \(X\) 對應 n 次航班準點的次數。

這些隨機變數的分佈就是幾何分佈,其 PMF 為:

\[P(X = k) = p(1-p)^{k-1} \]

根據 PMF 推導期望與方差,假設伯努利實驗的隨機變數只有兩個值 0(不發生),1(發生),那麼期望為:

\[E[X] = p + 2p(1-p) + 3p(1-p)^2 + ... + np(1-p)^{n-1} \]

\[(1-p)E[X] = p(1-p) + 2p(1-p)^2 + 3p(1-p)^3 + ... + np(1-p)^{n} \]

\[E[X]-(1-p)E[X] = p + p(1-p) + p(1-p)^2 + ... + p(1-p)^{n-1} - np(1-p)^{n} \]

\[pE[X] = p\frac{1-(1-p)^n}{1-(1-p)} - np(1-p)^n \]

\[E[X] = \frac{1-(1-p)^n}{1-(1-p)} - n(1-p)^n \]

當 n 趨近於無窮的時候:

\[E[X] = \frac{1}{p} \]

方差為:

\[D[X] = E[X^2] - E[X]^2 \]

\[E[X^2] = p + 2^2p(1-p) + 3^2p(1-p)^2 + ... + n^2p(1-p)^{n-1} \]

\[\frac{E[X^2]}{p} = 1 + 2^2(1-p) + 3^2(1-p)^2 + ... + n^2(1-p)^{n-1} \]

假設 q = 1-p,則有:

\[\frac{E[X^2]}{1-q} = 1 + 2^2q + 3^2q^2 + ... + n^2q^{n-1} \]

根據求導公式,則有:

\[\frac{E[X^2]}{1-q} = (q + 2q^2 + 3q^3 + ... + nq^{n})' \]

根據推導期望的結果,可以知道:

\[q + 2q^2 + 3q^3 + ... + nq^{n} = \frac{E(X)(q)}{1-q} = \frac{q}{(1-q)^2} \]

根據求導公式\([f(x)/g(x)]'=[f'(x)g(x)-f(x)g'(x)]/[g(x)]^2\),則有:

\[\frac{E[X^2]}{1-q} = (\frac{q}{(1-q)^2})' = \frac{(1-q)^2 - ((1-q)^2)'q}{(1-q)^4} = \frac{1-2q+q^2-(-2q + 2q^2)}{(1-q)^4} = \frac{1-q^2}{(1-q)^4} = \frac{1+q}{(1-q)^3} \]

則:

\[E[X^2] = \frac{1+q}{(1-q)^2} = \frac{2-p}{p^2} \]

則:

\[D[X] = E[X^2] - E[X]^2 = \frac{2-p}{p^2} - \frac{1}{p^2} = \frac{1-p}{p^2} \]

接下來我們繼續通過程式模擬:

from scipy.stats import geom
import matplotlib.pyplot as plt
import numpy as np
import seaborn
#我個人比較喜歡這個主題
seaborn.set_style("whitegrid")
#使用內建庫 geom 模擬 p = 0.5 的情況,隨機 100000 次
geom_rv = geom(p=0.5)
geom_sim = geom_rv.rvs(size=100000)
#計算本次平均值以及標準差
print ("Mean: %g" % np.mean(geom_sim))
print ("Std: %g" % np.std(geom_sim, ddof=1))
#繪圖,利用歸一化的直方圖,這樣展示的很接近概率質量函式
plt.hist(geom_sim, bins=20, density=True, stacked=True)
#設定要顯示的座標值
plt.gca().axes.set_xticks(range(1,11))
plt.show()

image

根據公式計算出的期望為 \(\frac{1}{p}=2\),與模擬的接近。根據公式計算出方差為 \(\frac{1-p}{p^2}=2\),標準差約為 1.41421 也和模擬的接近。

相關文章