python 二项分布_二项分布的理论基础、应用及Python实践
二項(xiàng)分布是概率統(tǒng)計(jì)中非常基礎(chǔ)、非常實(shí)用的一種分布,可以說它在我們的生活中無所不在。它說明了這樣一種現(xiàn)象:在給定的試驗(yàn)次數(shù)中,某一結(jié)果會(huì)發(fā)生多少次。
比如:
這個(gè)月有多少天會(huì)刮北風(fēng)?
今年有多少天會(huì)下雨?
經(jīng)過一個(gè)路口100次,有多少次會(huì)是綠燈?
一年之中會(huì)有多少次出門就見狗?
伯努利分布伯努利分布是二項(xiàng)分布的基礎(chǔ),它只有兩種狀態(tài),比如拋硬幣的時(shí)候,結(jié)果只有正面和反面兩種情況,且兩種情況的概率之和為1。也就是說,當(dāng)我們給定正面朝上的概率的時(shí)候,這個(gè)分布的一切就都確定了。
我們以0和1來標(biāo)識(shí)這兩種可能的結(jié)果,那么其概率函數(shù)為:
那么其期望值為:
其方差為:
排列組合1. 排列
從n個(gè)對(duì)象中有序地挑選出r個(gè)對(duì)象,我們稱之為排列,我們用以下公式統(tǒng)計(jì)其可能產(chǎn)生的排列數(shù):
2. 組合
考慮另一種情況,仍然是從n個(gè)對(duì)象中抽取r個(gè)對(duì)象,但是這次我們不考慮其順序,這種過程我們稱之為組合。我們用以下公式統(tǒng)計(jì)其可能產(chǎn)生的組合數(shù):
可以看出,這是n選r的排列數(shù)除以r的排列數(shù)。上述公式又被稱作二項(xiàng)系數(shù),通常用“n選r”表示。
3. Python計(jì)算
那么接下來我們用Python來寫一個(gè)函數(shù),用來計(jì)算不同參數(shù)下的排列與組合的數(shù)量。在排列組合的計(jì)算中,我們可能會(huì)輸入兩個(gè)參數(shù):總樣本量n、需要抽取的樣本數(shù)k。
那么我們就定義如下函數(shù):
from functools import reducedef PC(n, k): """ 計(jì)算并返回排列組合數(shù) """ # 非法輸入返回空 if n <= 0 or k < 0 or n < k: print('Wrong Input!') return None # k為0時(shí),排列組合的情況恒為1 if k == 0: return 1, 1 # 生成正序及倒序的序列 series_asc = list(range(1, n+1)) series_desc = sorted(series_asc, reverse=True) # 排列 permutation = reduce(lambda x, y: x*y, series_desc[:k]) # 組合 perm2 = reduce(lambda x, y: x*y, series_asc[:k]) combination = int(permutation / perm2) return permutation, combination隨手測試幾個(gè):
for n in range(1, 5): for k in range(1, 3): print('-'*10) print(n, k) print(PC(n, k))結(jié)果是正確的:
----------1 1(1, 1)----------1 2Wrong Input!None----------2 1(2, 2)----------2 2(2, 1)----------3 1(3, 3)----------3 2(6, 3)----------4 1(4, 4)----------4 2(12, 6)二項(xiàng)分布回顧伯努利分布的情況:一次實(shí)驗(yàn)只有可能有兩種結(jié)果,分別用0和1來表示,其中結(jié)果1發(fā)生的概率為p。那么在n次獨(dú)立實(shí)驗(yàn)中,不考慮順序的情況下,結(jié)果1出現(xiàn)k次的概率是多少?
首先,因?yàn)閚次實(shí)驗(yàn)相互獨(dú)立,所以根據(jù)乘法定律,任何一種結(jié)果1出現(xiàn)k次的場景發(fā)生的概率均為:
然后,我們需要考慮結(jié)果為1的次數(shù)剛好為k的情況有多少種。很明顯,這就是一個(gè)伯努利試驗(yàn)的組合問題,n次實(shí)驗(yàn)中有k次結(jié)果為1的情況共有“n選k”種,兩者相乘就是該事件發(fā)生的概率。
因此:
Python計(jì)算那么我們來用Python實(shí)現(xiàn)一個(gè)計(jì)算二項(xiàng)分布概率的小工具,在這里,我們的輸入?yún)?shù)包含總試驗(yàn)次數(shù)n、正樣本發(fā)生的次數(shù)k以及正樣本發(fā)生的概率p:
def binominal_prob(n, k, p): """ 計(jì)算并返回二項(xiàng)分布中某結(jié)果發(fā)生的概率 """ # 任一k次成功的序列出現(xiàn)的概率 p_base = p ** k * (1-p) ** (n-k) # n次試驗(yàn)中k次成功的組合數(shù) # 直接用上邊我們編寫的排列組合函數(shù)來求解 combination = PC(n, k)[1] p_result = p_base * combination return p_result那么接下來,我們利用我們剛剛寫好的小工具,來看一下在10次試驗(yàn)中,不同的概率對(duì)應(yīng)的二項(xiàng)分布是什么樣的。
probs = [binominal_prob(10, i, 0.5) for i in range(11)]我們將結(jié)果畫出來看看:
%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snssns.set()probs = [round(i/10,1) for i in range(1, 10)]n = 20plt.figure(figsize=(16, 6))for p in probs: dist_probs = [binominal_prob(n, i, p) for i in range(n+1)] plt.plot(range(n+1), dist_probs, label='p={0}'.format(p))plt.legend()plt.title('Binominal Distributions of Different P value')plt.savefig('binominal.jpg')plt.show()或者我們使用交互式的繪圖庫plotly來嘗試同樣的事情:
import plotly.graph_objects as goprobs = [round(i/10,1) for i in range(1, 10)]n = 20fig = go.Figure()for p in probs: dist_probs = [binominal_prob(n, i, p) for i in range(n+1)] fig.add_trace(go.Scatter( x=list(range(n+1)), y=dist_probs, name='p={0}'.format(p) ))fig.show()可以看到,plotly實(shí)現(xiàn)的效果更加靚麗,且額外支持了動(dòng)態(tài)交互,在這里我就選擇把p=0.8這條線隱藏了起來。
一個(gè)利用極大似然估計(jì)求二項(xiàng)分布概率參數(shù)的例子我們現(xiàn)在想象一種情況,有一枚分布不太均勻的硬幣,每次拋向空中后,落地為正面的概率為p,任意兩次實(shí)驗(yàn)之間相互獨(dú)立。現(xiàn)在我們做了4次實(shí)驗(yàn),其中有三次正面朝上,那么請(qǐng)問p的值為多少?
我們之前曾經(jīng)提到過極大似然估計(jì),在這里我們用同樣的思路去估計(jì)p的取值。極大似然估計(jì)的思想就是尋找一個(gè)參數(shù),使得當(dāng)前結(jié)果發(fā)生的概率最大,那么我們先定義出來當(dāng)前結(jié)果發(fā)生的概率公式:
對(duì)其求導(dǎo)并使導(dǎo)數(shù)為0,有:
可得,當(dāng)p=0.75時(shí),P(X=3)=0.422達(dá)到最大(另一個(gè)解p=0顯然不可能,因?yàn)橛矌懦弦呀?jīng)發(fā)生了,并不是“不可能事件”;另外考慮不同區(qū)間導(dǎo)數(shù)的取值也可以得到答案)。
- END -
文源網(wǎng)絡(luò),僅供學(xué)習(xí)之用,如有侵權(quán),聯(lián)系刪除。
往期精彩◆ ?50款開源工具你都用過嗎?
◆ ?python+C、C++混合編程的應(yīng)用
◆ ?python網(wǎng)絡(luò)爬蟲的基本原理詳解
◆ ?Python自動(dòng)操控excel,一小時(shí)解決你一天的工作
◆ ?如何用Python增強(qiáng)Excel,減少處理復(fù)雜數(shù)據(jù)的痛苦?
總結(jié)
以上是生活随笔為你收集整理的python 二项分布_二项分布的理论基础、应用及Python实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: input 0.1无法相加_你真的知道0
- 下一篇: python三大器_Python - 三