Numpy生成隨機分佈函數“二項分佈”+“正態分佈”,使用matplotlib展示概率質量函數(PMF)/概率密度函數(PDF)

  • numpy.random.binomial(n,p,size):產生size個符合(n,p)的二項分佈隨機數

即,相當於進行size次實驗,每次實驗都投擲n枚硬幣/每次實驗都將一枚硬幣投擲n次,記錄size次實驗中,正面朝上分別爲0-n次的實驗次數;其中每次試驗的成功概率爲p

1. 固定n值,對比p和size不同值的不同結果

'''繪製二項分佈的概率質量函數,使用不同參數展示'''
import matplotlib.pyplot as ply
import numpy as np

 # 產生二項分佈的隨機數並製作成直方圖
def plot_binomial(n,p,size):
    sample = np.random.binomial(n,p,size)  
    # 繪製直方圖,設置標題和座標
    n,edgebin,patch=plt.hist(sample, bins=n, rwidth=0.6) 
    plt.title('Binomial PMF with n={}, p={},size={}'.format(n,p,size))  
    plt.xlabel('number of successes')
    plt.ylabel('probability')
    # 打印n和bins的取值範圍
	print("edgebin = {}".format(edgebin))
    print("size number in bins = {}".format(n))

 # 製作四組不同參數輸入的結果圖對比
def difference_p_and_size():
    plt.figure(figsize=(12,10))
    
    ax=plt.subplot(221)
    plot_binomial(10, 0.5,10000)
    
    ax=plt.subplot(222)
    plot_binomial(10, 0.5,100)
    
    ax=plt.subplot(223)
    plot_binomial(10, 0.2,10000)
    
    ax=plt.subplot(224)
    plot_binomial(10, 0.8,10000)
    
    plt.show()

# 調用函數    
difference_p_and_size() 

----------------
# 圖221中打印的結果:
edgebin = [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
size number in bins = [  10.  112.  408. 1175. 2062. 2478. 1986. 1200.  443.  126.]

# 圖222中打印的結果:
edgebin = [0.  0.9 1.8 2.7 3.6 4.5 5.4 6.3 7.2 8.1 9. ]
size number in bins = [ 1.  4.  6. 16. 17. 27. 16.  7.  5.  1.]

在這裏插入圖片描述

說明:

(1)每組“size number in bins”之和 = “size”參數;
bins的取值範圍在0-n之間,但是根據隨機數生成的結果不一樣,bins的取值會不同
(2)對於二項分佈來說,size的值越大即試驗次數越多,結果越趨近於“正態分佈”;
所以圖331和332之間,前者效果“更好”;
且size足夠大時,數據趨於穩定,不夠大時,每次生成的結果差距也會比較明顯(因爲隨機數據不一樣)
(3)在p=0.5 時,分佈無偏移;但是p=0.2或者p=0.8時,分佈有偏移;詳見333和334圖

2. 固定p值,對比不同n值的結果

import matplotlib.pyplot as ply
import numpy as np

 # 產生二項分佈的隨機數並製作成直方圖
def plot_binomial(n1,n2,p,size):
    # 使用同一套隨機數
    np.random.seed(1)
    sample1 = np.random.binomial(n1,p,size)  
    sample2 = np.random.binomial(n2,p,size)  
    # 繪製直方圖,設置標題和座標,及圖標
    labels=["sample1","sample2"]
    plt.hist(sample1, bins=n1, rwidth=0.6,alpha=0.6,label=labels) 
    plt.hist(sample2, bins=n2, rwidth=0.6,alpha=0.6,label=labels)
    plt.title('Binomial PMF with p={},size={}'.format(p,size))  
    plt.xlabel('number of successes')
    plt.ylabel('probability')
    # 展示圖標和圖形
    plt.legend()
    plt.show() 

plot_binomial(10,100,0.5,10000)

在這裏插入圖片描述

說明:

兩個圖像都呈較好的“正態分佈”;但是輸入參數n=100時,“成功次數”可以取的值的範圍也增加,樣本數據的值域更寬;這也導致落其“正態分佈”更平緩(只是單純的分攤範圍大,分擔數量少而已,“方差”大小的形象下面會詳細對比)

  • numpy.random.normal(loc, scale, size):正態分佈

正態分佈是一種很常用的統計分佈,可以描述現實世界的很多事物,同時具備非常漂亮的性質,此處不做過多的介紹;除此之外,我們更經常會用到的numpy.random.randn(size)實際上就是標準正態分佈(μ=0,σ=1)即numpy.random.normal(loc=0, scale=1, size)

import matplotlib.pyplot as ply
import numpy as np

# '''正態分佈概率密度函數'''的實現
def norm_pdf(x,mu,sigma):
    pdf = np.exp(-((x - mu)**2) / (2* sigma**2)) / (sigma * np.sqrt(2*np.pi)) 
    return pdf

mu = 0    # 均值爲0
sigma1 = 1 # 標準差爲1
sigma2 = 3

# 生成數據 
sample1 = np.random.normal(loc=mu, scale=sigma1, size=10000)
sample2=np.random.normal(loc=mu,scale=sigma2,size=10000)
# 用統計模擬繪製正態分佈的直方圖
plt.figure(figsize=(10,8))
plt. hist(sample1, bins=100, alpha=0.3,density=True,label="sample1")    # 如果不使用density參數會導致無法呈現PDF曲線,因爲pdf曲線Y軸小到無法在正態分佈的直方圖Y軸值下展示
plt.hist(sample2,bins=100,alpha=0.3,density=True,label="sample2")
# 根據正態分佈的公式繪製PDF曲線
x = np.arange(-10, 10, 0.01)
y1 = norm_pdf(x, mu, sigma1)
y2 = norm_pdf(x,mu,sigma2)
plt.plot(x,y1,color='orange',lw=3)
plt.plot(x,y2,c='k',lw=2)

plt.legend()
plt.show()

在這裏插入圖片描述

說明:

“方差”越大,分佈越平緩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章