目錄
全局設置
文章組織方式為代碼與可視化的方式展開, 個別分布會進行數(shù)學推導.個人認為應用廣泛也需要通過舉例理解的分布與小知識點, 會盡量展開討論并以實例說明. 注意, 在我們展開討論常見分布之前, 需要先理解隨機變量以及由隨機變量的概率分布推導而來的概率分布, 如果您對隨機變量的理解模棱兩可, 盡管后面的內容會讓你理解起來不困難, 但您也不會從中獲益多少. 因此, 請先理解隨機變量及概率分布后過來看后續(xù)內容.
import matplotlib.pyplot as plt
import seaborn as sns
###################################################
# 設置全局繪圖風格seaborn, 圖片統(tǒng)一大小12 * 8.
# python 3
###################################################
plt.style.use('seaborn') # pretty matplotlib plots
plt.rcParams['figure.figsize'] = (12, 8)
常見離散分布
我們依次從上述幾種離散分布展開介紹:
- 幾何分布
- 伯努利分布
- 二項分布
- 離散均勻分布
- 泊松分布
0-1分布-(0-1)Distribution
隨機變量只能取0與1兩個值, 那么稱隨機變量X服從0-1分布, 分布律的數(shù)學表達式
也可以寫成
X | 0 | 1 |
---|---|---|
一次抽樣的結果(也叫樣本空間)如果只有兩種, 那么這次抽樣結果作為隨機變量可以是服從0-1分布的. 如: 一個貸款客戶提現(xiàn)后可能會逾期不還也可能準時還款, 如果逾期概率為0.1, 那么任何一個人不逾期的概率為; 一枚硬幣拋出后可能是正面也可能是反面, 拋出下面概率0.5, 那么出現(xiàn)反而的概率為, 當0與1的概率相同時, 可以認為離散均勻分布; 在大街上遇到一個人可能是男性或女性, 如果在中國遇到女性的概率為0.4, 那么遇到男性的概率為.
伯努利試驗與N重伯努利試驗-Bernoulli Distribution
一次試驗E只可能出現(xiàn)兩種結果和, 則稱這次試驗E為伯努利(Bernounlli)試驗. 與0-1分布的區(qū)別在于, 沒有硬性規(guī)定隨機變量的值只能取0與1, 但如果將E的結果編碼為0與1, 其實二者沒有區(qū)別.
對于一次試驗, 令, 此時.如果將E獨立地重復地進行N次, 則稱這一串重復的獨立試驗為N重伯努利試驗.
舉例
- 拋1次硬幣, 出現(xiàn)正面為A, 出現(xiàn)反面為. 拋硬幣100次, 則100重伯努利試驗.
- 1位貸款客戶, 逾期為A, 按時還款為. 觀察200位客戶的還款情況, 則是200次伯努利試驗(前提是這200位客戶互相不認識且對非惡意貸款客戶, 確保獨立重復性).
- 大街上遇到一個人, 女性為A, 男性為. 統(tǒng)計遇到的300個人, 則是300次伯努利試驗(300個人互相不認識, 確保獨立重復性).
- 從盒子里隨機選擇一個球, 黑色為A, 白色為. 連續(xù)選400次且每次都放回盒中, 這是400重伯努利試驗. 但如果連續(xù)400次, 都做不放回抽樣, 則由于前一次抽樣將影響后一次抽樣結果, 導致試驗之間不再獨立, 因此不能稱為多重伯努利試驗.
二項分布-Binomial Distribution
將N重伯努利試驗中結果A發(fā)生的次數(shù)記為隨機變量X, X服從二項分布, 記作. 特別地, 當時, X服從0-1分布.
拋硬幣4次, X表示出現(xiàn)正面的次數(shù), 設這枚硬幣一正面出現(xiàn)的概率, 其概率質量函數(shù)pmf與累計概率分布函數(shù)cdf見Figure2.
from scipy.stats import binom
n, p = 4, 0.1
bio_r = binom(n, p)
fig, axes = plt.subplots(1,2)
#橫坐標0, 1, 2, 3, 4表示正面出現(xiàn)的次數(shù)
x = np.arange(0,n+1)
#縱坐標binom.pmf,表示正面出現(xiàn)次數(shù)對應的概率
axes[0].plot(x, binom.pmf(x, n, p), 'bo', ms=8, label='binom pmf')
axes[0].vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)
axes[0].vlines(x, 0, bio_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best', frameon=False)
# 通過cdf計算概率, 并通過ppf校驗準確率
prob = binom.cdf(x, n, p)
axes[1].plot(x, prob, 'r-')
axes[0].set_title('pmf')
axes[1].set_title('cdf')
plt.show()
也可以手動計算驗證一下概率.
再做一次, 加深印象. 拋硬幣10次, 正面出現(xiàn)的概率. 代碼只需將n修改為10, 其它保持不變, pmf與cdf如Figure3所示.
繪圖時需要做一些改進.
觀察Figure2, 正面出現(xiàn)的次數(shù)大于3時, 概率已經(jīng)逼近0; 觀察Figure3, 正面出現(xiàn)的次數(shù)大于4時, 概率已經(jīng)逼近0, 使得二項分布圖中出現(xiàn)很多0值. 那么隨著試驗次數(shù)的增加, 出現(xiàn)0值的數(shù)量也會更多, 比如我們將n改為1000, 來看看pmf圖.
因此, 我們需要對橫坐標進行調整. 的概率值范圍在0-1之間, 我們只希望顯示概率值>0的成功次數(shù), 因此, 可以通過ppf函數(shù)求得成功次數(shù)的范圍(簡單介紹一下, ppf - percent point function, 是cdf函數(shù)的反函數(shù)).具體寫法如下代碼所示.
from scipy.stats import binom
n, p = 1000, 0.1
bio_r = binom(n, p)
fig, axes = plt.subplots(1,2)
#橫坐標0, 1, 2, 3, 4表示正面出現(xiàn)的次數(shù)
#x = np.arange(0,n+1)
#將橫坐標改為概率值為1% quantile的成功次數(shù)到概率值為99% quantile對應的成功次數(shù)
x = np.arange(binom.ppf(0.01, n, p), binom.ppf(0.99, n, p))
#縱坐標binom.pmf,表示正面出現(xiàn)次數(shù)對應的概率
axes[0].plot(x, binom.pmf(x, n, p), 'bo', ms=8, label='binom pmf')
axes[0].vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)
axes[0].vlines(x, 0, bio_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best', frameon=False)
# 通過cdf計算概率, 并通過ppf校驗準確率
prob = binom.cdf(x, n, p)
np.allclose(x, binom.ppf(prob, n, p)) # True
axes[1].plot(x, prob, 'r-')
axes[0].set_title('pmf')
axes[1].set_title('cdf')
plt.show()
幾何分布-Geometry Distribution
幾何分布也與N重伯努利試驗有關, 幾何分布的隨機變量X定義為: 結果第一次出現(xiàn)時試驗的次數(shù), 也可以理解為前k-1次結果為, 第k次結果為. 比如, 拋10次硬幣, 前9次都拋出反面, 第10次才拋出正面. 概率表達式
from scipy.stats import geom
# 從幾何分布概率表達式看, 只與概率值p和正面出現(xiàn)時的試驗次數(shù)有關.當我們繪制不同成功次數(shù)的pmf圖時, 則只需要調整參數(shù)p.
p = 0.1
geom_r = geom(p)
x = np.arange(geom.ppf(0.01, p), geom.ppf(0.99, p))
fig, axes = plt.subplots(1,2)
axes[0].plot(x, geom.pmf(x, p), 'bo', ms=8, label='geom pmf')
axes[0].vlines(x, 0, geom.pmf(x, p), colors='b',lw=5, alpha=0.5)
axes[0].vlines(x, 0, geom_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best', frameon=False)
axes[1].plot(x, geom.cdf(x, p), 'r-')
axes[0].set_title('geom_pmf')
axes[1].set_title('geom_cdf')
plt.show()
觀察不同p值對應的幾何分布, 發(fā)現(xiàn)一些幾何分布的特點.
- 幾何分布概率質量函數(shù)隨著試驗次數(shù)的增加單調遞減.
- p值越大, 嘗試試驗的次數(shù)相對要少.
離散均勻分布
試驗E的結果是有限可列個且等可能, 結果用隨機變量X表示, 有分布律表達式:
from scipy.stats import randint
a, b = 3, 10
randint_r = randint(a, b)
#x = np.arange(randint.ppf(0.01, a, b), randint.ppf(0.99, a, b))
x = np.arange(a,b)
fig, axes = plt.subplots(1,2)
axes[0].plot(x, randint.pmf(x, a, b), 'bo', ms=8, label='randint pmf')
axes[0].vlines(x, 0, randint.pmf(x, a, b), colors='b',lw=5, alpha=0.5)
axes[0].vlines(x, 0, randint_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best', frameon=False)
axes[0].set_ylim(0, 1/(b-a)+0.03)
axes[1].plot(x, randint.cdf(x, a, b), 'r-')
axes[0].set_title('randint_pmf')
axes[1].set_title('randint_cdf')
plt.show()
泊松過程與泊松分布-Poisson distribution
泊松過程與泊松分布是在實際生活中經(jīng)常能遇見的一種分布, 只是大家沒有從數(shù)學視角去抽象與理解它, 導致現(xiàn)象與本質發(fā)生了解耦. 但實際泊松分布十分有用. 我們先從泊松過程開始展開討論, 進而拓展到泊松分布, 最后推廣到連續(xù)的指數(shù)分布.
泊松過程-Poisson Process
泊松過程是一個沿著時間軸進行計數(shù)的過程, counting process. 具體來說, 用表示從時間0到時間內某事件A的發(fā)生次數(shù), 當滿足4個條件時, 這個counting process就是泊松過程.
- 是遞增的(或者不保持不變), 并且隨著時間的推移, , , 這類增量, 也叫增量隨機變量之間是相互獨立的.
1
與2
是對隨機變量的特點歸納; 3
說明時間t內事件A發(fā)生一次的概率與時間間隔成正比(), 即時間間隔越長, 事件A發(fā)生的概率越大. 生活中有很多這樣的例子, 公交站等車, 等的時間越久下一班車來的概率就越大; 一個便秘的患者, 距離上一次排便的時間越長, 新一次排便的可能性也就越大等等; 4
是說, 時間間隔內, 事件A發(fā)生兩次的概率是時間間隔的高階無窮小,即. 可以這么理解, 當我們把時間軸劃分成無窮多個非常小的區(qū)間時, 即, 而在這個時間間隔內, 事件A發(fā)生2次的概率為0.
非均勻泊松過程-Non Homgenous Poisson Process
當泊松過程的是時間t的函數(shù)時, 這時是時變的, 這時的泊松過程稱作非均勻泊松過程. 舉個例子也能大概感受這里的非均勻特點. 比如故宮博物院每年接收的觀光游客有一個數(shù)字C, 游客數(shù)量每年都在遞增, 但每年的不同時間段接收的游客數(shù)量卻有高有低, 即存在寒暑假游客多于平時的情況.
非均勻泊松過程可以轉化成均勻泊松過程, 假設當前時域有一個非均勻泊松過程其事件發(fā)生速率為, 可變換時域為:
泊松分布
基于泊松過程的假設, 我們有
約定:
- 表示從時刻事件A發(fā)生k次的概率
-
表示時間間隔內事件A發(fā)生次數(shù)由
i
->j
的概率.
若時刻事件A發(fā)生的次數(shù)為, 那么該時刻之前有兩種狀態(tài), 即A發(fā)生k次可以是從時刻的次發(fā)展為次; 也可以是時刻的的繼續(xù)保持. 表達式如下:
由泊松過程推導的基礎假設可得:
代入(1), (2)
式:
整理(3), (4)
式得:
當時:
解方程(6)
:
調(5)
式中, 將(7)
代入(5)
式有:
解得: .
k = 2,
k = 3,
對于任意的有
由于, 即:
泰勒展開后解得, 得泊松分布分布律:
總結
泊松分布由基礎假設泊松過程推導而來. 基本思想是將一段時間進行劃分, 統(tǒng)計每一個時間劃分里事件A發(fā)生的次數(shù), 最終得到整個時間劃分里事件A發(fā)生的次數(shù)概率大小. 我們也可以將泊松分布畫出來, 結合圖形來理解.
from scipy.stats import poisson
ld = 1
poisson_r = poisson(ld)
x = np.arange(poisson.ppf(0.01, ld), poisson.ppf(0.99, ld))
fig, axes = plt.subplots(1,2)
axes[0].plot(x, poisson.pmf(x, ld), 'bo', ms=8, label='poisson_pmf')
axes[0].vlines(x, 0, poisson.pmf(x, ld), colors='b',lw=5, alpha=0.5)
axes[0].vlines(x, 0, poisson_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best', frameon=False)
axes[1].plot(x, poisson.cdf(x, ld), 'r-')
axes[0].set_title('poisson_pmf')
axes[1].set_title('poisson_cdf')
plt.show()
可能大家看完這些不同對應的泊松分布后, 還是有些不能理解大小的實際意義. 來看幾個服從泊松分布的例子.
某公安局在長度為的時間間隔內收到的緊急呼救次數(shù)X服從參數(shù)為的泊松分布, 而與時間間隔的起點無關(時間以小時計).
(1). 某一天中午12時到下午3時沒有收到緊急呼救的概率是多少?
(2). 某一天中午12時到下午5時至少收到1次緊急呼救的概率是多少?
這個盒子告訴我們呼救次數(shù)X服從泊松分布, 因此比較好計算. 直接代入泊松分布的pmf中可得到兩個問題的概率大小.
12點到15點沒有收到緊急呼叫的概率
12點到17點至少收到1次緊急呼叫的概率, 我們先計算對立事件一次也沒有收到的概率.
也可以使用代碼計算
# 第一個問題
poisson(3/2).pmf(0) # 0.22313016014842982
# 第二個問題
1 - poisson(5/2).pmf(0) #0.9179150013761012
結論1: 時間間隔越大, 越大, 事件發(fā)生的概率越大. 給人直觀上的感受時, 等得越久, 某件事情就越來越可能會發(fā)生.
結論2: 泊松分布的參數(shù)與時間間隔成正比, 從結論1也能直觀感受到.
結論3: 結合Figure11~Figure13的泊松分布圖, 隨著的增加, 其分布與二項分布十分相似, 所以時常有用二項分布近似泊松分布的做法. 從二者概率的定義上也能得出一個相似的結論, 二者都是統(tǒng)計某個事件A發(fā)生次數(shù)的概率. 二項分布是做n次試驗, 而每次試驗也意味著時間的消耗, 即本質上也是在做一段時間內, 事件A發(fā)生k次的概率.
的泊松分布 與 的二項分布
from scipy.stats import poisson, binom
ld = 100
poisson_r = poisson(ld)
n, p = 1000, 0.1
bio_r = binom(n, p)
x = np.arange(binom.ppf(0.01, n, p), binom.ppf(0.99, n, p))
fig, axes = plt.subplots(1,2)
axes[0].plot(x, poisson.pmf(x, ld), 'bo', ms=8, label='$\lambda=100$')
axes[0].plot(x, binom.pmf(x, n, p), 'r-', ms=8, label='$n=100, p=0.1$')
axes[0].vlines(x, 0, poisson.pmf(x, ld), colors='b',lw=2, alpha=0.5)
axes[0].vlines(x, 0, poisson_r.pmf(x), colors='k', linestyles='-', lw=1, label='frozen pmf')
axes[0].legend(loc='best')
axes[1].plot(x, binom.cdf(x, n, p), 'r-', label='binom_cdf')
axes[1].plot(x, poisson.cdf(x, ld), 'b-', label='poisson_cdf')
axes[0].set_title('pmf')
axes[1].set_title('cdf')
plt.show()
常見連續(xù)分布
- 均勻分布
- 指數(shù)分布
- 正態(tài)分布
- gamma分布
- t分布
- 卡方分布
均勻分布
概率密度函數(shù), , 當a=0, b=1時, 為標準均勻分布.
####################
# 構建一個標準均勻分布
####################
from scipy.stats import uniform
fig, ax = plt.subplots(1, 1)
x = np.linspace(uniform.ppf(0.01),uniform.ppf(0.99), 100)
ax.plot(x, uniform.pdf(x), 'r-', lw=5, alpha=0.6, label='uniform pdf')
rv = uniform()
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
r = uniform.rvs(size=1000)
plt.hist(x=r, normed=True, histtype='stepfilled', alpha=0.2)
plt.legend(loc='best', frameon=False)
plt.show()
指數(shù)分布
指數(shù)分布, , 當時, 稱為標準指數(shù)分布
####################
# 構建一個標準指數(shù)分布
####################
from scipy.stats import expon
fig, ax = plt.subplots(1, 1)
x = np.linspace(expon.ppf(0.01),expon.ppf(0.99), 100)
ax.plot(x, expon.pdf(x), 'r-', lw=5, alpha=0.6, label='expon pdf')
rv = expon()
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
r = expon.rvs(size=1000)
plt.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
plt.legend(loc='best', frameon=False)
plt.show()
正態(tài)分布
正態(tài)分布, , 當時, 稱為標準正態(tài)分布, 記作
####################
# 構建一個標準正態(tài)分布
####################
from scipy.stats import norm
fig, ax = plt.subplots(1, 1)
x = np.linspace(norm.ppf(0.01), norm.ppf(0.99), 100)
ax.plot(x, norm.pdf(x), 'r-', lw=5, alpha=0.6, label='norm_pdf')
rv = norm()
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen_pdf')
r = norm.rvs(size=1000)
ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.title('normal distribution with $\mu = 0, \sigma = 1$')
plt.show()
分布
函數(shù)
分部積分后有性質:
令 , 其中是任意實數(shù)
分布概率密度函數(shù)
, 為shape parameter, 為inverse scale parameter.當時, 稱為標準分布
將 函數(shù)稍加變換有
于是取積分中的函數(shù)作為分布的pdf函數(shù), 即:
令, 得到更一般的 分布pdf:
####################
# 構建一個標準gamma分布
####################
from scipy.stats import gamma
al = 1.99
gamma.stats(al, moments='mvsk')
fig, ax = plt.subplots(1,1)
x = np.linspace(gamma.ppf(0.01, al), gamma.ppf(0.99, al), 100)
ax.plot(x, gamma.pdf(x, al), 'r-', lw=5, alpha=0.5, label='gamma_pdf')
rv = gamma(al)
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen_pdf')
r = gamma.rvs(al, size=1000)
ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()
als = [2,3,5,10,20]
gamma.stats(al, moments='mvsk')
fig, ax = plt.subplots(1,1)
for al in als:
x = np.linspace(gamma.ppf(0.01, al), gamma.ppf(0.99, al), 100)
ax.plot(x, gamma.pdf(x, al), lw=2, alpha=0.5, label='a={}'.format(al))
plt.legend(loc='best')
plt.show()
關鍵點
- p-value是什么
- p-value如何計算
- p-value實際意義
summarize: 小概率事件符合小概率事實的依據(jù)是p-value足夠小.
如: 男性懷孕作為小概率事件, 若p-value=10%, 則不足以讓人們相信該事件真的發(fā)生了, 因為10%的p-value說明這事已經(jīng)不再是小概率事件, 從直觀上也能感覺說這話的人在吹牛.