- 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()
說明:
“方差”越大,分佈越平緩