.

iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
AI/ ML & Data

藉由 Python 介紹統計學與機器學習系列 第 10

Day 10:【統計概念-2】藉 Python 模擬機率分布與隨機亂數

  • 分享至 

  • xImage
  •  

接續 - 連續型分配 PDF

t 分配

t-PDF

t 分配在 Python 的 PDF 程式碼為 t.pdf,其程式所使用的 PDF 如下,設定不同的參數值 $\nu$ ,如下圖,由下至上的橘色曲線為 $\nu = 0.1, 0.2, 0.3, \cdots, 1, \mbox{and}\ 3, 6, 9, \cdots, 30$ 的 t 分配;而紅色線為標準常態分布,也稱作 Z 分布。不論是 t 分布或標準常態分布,兩者皆對稱於 Y 軸。發現當 t 分布之參數 $\nu$ 越大,其 PDF 會從厚尾漸漸變成窄尾,且最大值上升。此外,在參數 $\nu$ 大到一個水準之後,t 分布之 PDF 形狀會 十分接近紅線的標準常態分布。

t-dist

# t Distribution 

from scipy.stats import t, norm 


xlim = [-6, 6]
x_diff_t = np.linspace(xlim[0], xlim[1], 1000)

# df
df1 = np.arange(0.1, 1, 0.1)
df2 = np.arange(3, 30, 3)
c = np.concatenate([df1, df2], axis=0)
v = np.array(c)

# fix xlim before animation
gid, ax = plt.subplots(figsize=[8, 6])
ax.axis([xlim[0], xlim[1], 0, 0.5])

# color
col = plt.cm.YlOrBr(np.linspace(0.3, 1, len(v)))

for i in range(len(v)):
  y = t.pdf(x_diff_t, v[i])
  ax.plot(x_diff_t, y, color=col[i], lw=2)


# normal(0, 1)
y_sd_normal = norm.pdf(x_diff_t, 0, 1)
ax.plot(x_diff_t, y_sd_normal, label='Z distribution',\
        color='r' ,linewidth=4)
ax.legend(fontsize=20)
ax.grid(True)
ax.set_facecolor('#f7e8e3') # 背景色

ax.set_title(r'T distribution with different parameters $\nu$')

plt.show()

Beta 分配

beta-PDF.png

Beta 分配在 Python 的 PDF 程式碼為 `beta.pdf,其程式所使用的 PDF 如上式。設定不同的參數值 $a$ 與 $b$,如下圖,可以看出:

  1. 當 $a$ 固定時,隨 $b$ 越大,Beta 分配漸漸從左偏變成右偏。
  2. 當 $b$ 固定時,隨 $a$ 越大,Beta 分配漸漸從右尾變成左尾。
  3. 當 $a$ 與 $b$ 相同時,函數對成於 $x=1$,隨 $a$ 與 $b$ 值變小,分配的峰度(Kurtosis)漸小。到 $a=b=1$ 時,PDF 變成一水平線;而到 $a=b<1$ 時, PDF 漸漸變成雙峰分配。

其中「峰度(Kurtosis)」與「偏度(Skewness)」的概念對一般人而言比較陌生,他們的解釋可以參考:

beta-dist

# Beta Distribution

from scipy.stats import beta

xlim = [0, 1]
x_diff_beta = np.linspace(xlim[0], xlim[1], 1000)

fig, ax = plt.subplots(2, 2, figsize=[8, 6])

# fig1
a0 = 9
b0 = np.arange(1, 31, 1)

for i in b0:
  y = beta.pdf(x_diff_beta, a0, i)
  ax[0][0].plot(x_diff_beta, y, linewidth=2, color='green')

ax[0][0].grid(True)
ax[0][0].text(0.2, 8, '$a = 9,\ 1 \leq b \leq 30$', fontsize=16)


# fig2
a1 = np.arange(1, 31, 1)
b1 = 9

for i in a1:
  y = beta.pdf(x_diff_beta, i, b1)
  ax[0][1].plot(x_diff_beta, y, linewidth=2, color='green')

ax[0][1].grid(True)
ax[0][1].text(0.2, 8, '$1 \leq a \leq 30,\ b = 9$', fontsize=16)


# fig3
a2 = np.arange(1, 18, 1)
b2 = np.arange(1, 18, 1)


for i in a2:
  y = beta.pdf(x_diff_beta, i, i)
  ax[1][0].plot(x_diff_beta, y, linewidth=2, color='green')

ax[1][0].set_ylim(0, 7+0.2)
ax[1][0].set_yticks(np.arange(0, 8, 1))
ax[1][0].grid(True)
ax[1][0].text(0.2, 6, '$1 \leq a = b \leq 17$', fontsize=16)

# fig4
a3 = np.arange(0, 2, 0.2)

for i in a3:
  y = beta.pdf(x_diff_beta, i, i)
  ax[1][1].plot(x_diff_beta, y, linewidth=2, color='green')

ax[1][1].set_yticks(np.arange(0, 8, 1))
ax[1][1].set_ylim(0, 7+0.2)
ax[1][1].grid(True)
ax[1][1].text(0.2, 6, '$0 \leq a = b \leq 1$', fontsize=16)

fig.tight_layout() # 縮減子圖間距

fig.suptitle(r'Beta distribution with different parameters $a, b$', \
             x=0.52, y=1.03)

plt.show()

上一篇
Day 09:【統計概念-1】藉 Python 模擬機率分布與隨機亂數
下一篇
Day 11:【統計概念-3】連續型分配 -- F & Normal PDF
系列文
藉由 Python 介紹統計學與機器學習31
圖片
  直播研討會

尚未有邦友留言

立即登入留言