1 導入包
導入本次實驗所用的4種常見分布,連續分布的代表:beta分布、正態分布,均勻分布,離散分布的代表:二項分布。
import numpy as np
from scipy.stats import beta, norm, uniform, binom
import matplotlib.pyplot as plt
from functools import wraps2 定義帶參數的裝飾器
繪圖裝飾器帶有四個參數分別表示legend的2類說明文字,y軸label, 保存的png文件名稱。
# 定義帶四個參數的畫圖裝飾器
def my_plot(label0=None, label1=None, ylabel='probability density function', fn=None):
def decorate(f):
@wraps(f)
def myplot():
fig = plt.figure(figsize=(16, 9))
ax = fig.add_subplot(111)
x, y, y1 = f()
ax.plot(x, y, linewidth=2, c='r', label=label0)
ax.plot(x, y1, linewidth=2, c='b', label=label1)
ax.legend()
plt.ylabel(ylabel)
# plt.show()
plt.savefig('./img/%s' % (fn,))
plt.close()
return myplot
return decorate3 均勻分布
從圖中可看出,紅色概率密度函數只在0~1才會發生,曲線與x軸的0~1區間所封閉的面積為全概率1.0.
# 均勻分布(uniform)
@my_plot(label0='b-a=1.0', label1='b-a=2.0', fn='uniform.png')
def unif():
x = np.arange(-0.01, 2.01, 0.01)
y = uniform.pdf(x, loc=0.0, scale=1.0)
y1 = uniform.pdf(x, loc=0.0, scale=2.0)
return x, y, y14 二項分布
紅色曲線表示發生一次概率為0.3,重複50次的密度函數,二項分布期望值為0.3*50 = 15次。看到這50次實驗,很可能出現的次數為10~20.可與藍色曲線對比分析。
@my_plot(label0='n=50,p=0.3', label1='n=50,p=0.7', fn='binom.png', ylabel='probability mass function')
def bino():
x = np.arange(50)
n, p, p1 = 50, 0.3, 0.7
y = binom.pmf(x, n=n, p=p)
y1 = binom.pmf(x, n=n, p=p1)
return x, y, y15 高斯分布
紅色曲線表示均值為0,標準差為1.0的概率密度函數,藍色曲線的標準差更大,所以它更矮胖,顯示出取值的多樣性,和不穩定性。
# 高斯 分布
@my_plot(label0='u=0.,sigma=1.0', label1='u=0.,sigma=2.0', fn='guass.png')
def guass():
x = np.arange(-5, 5, 0.1)
y = norm.pdf(x, loc=0.0, scale=1.0)
y1 = norm.pdf(x, loc=0., scale=2.0)
return x, y, y16 beta分布
beta分布的期望值如下,可從下面的兩條曲線中加以驗證:
@my_plot(label0='a=10., b=30.', label1='a=4., b=4.', fn='beta.png')
def bet():
x = np.arange(-0.1, 1, 0.001)
y = beta.pdf(x, a=10., b=30.)
y1 = beta.pdf(x, a=4., b=4.)
return x, y, y17 總結
統一調用以上四個函數,分別繪製概率曲線:
distrs = [unif, bino, guass, bet]
for distri in distrs:
distri()