python實做AI常用的機率分布模型,及資料視覺化

AI與統計學、線性代數、微積分都有密不可分的關係,本章我們會探討並實做AI機器學習常用的分布模型:伯努利分布(Bernoulli distribution)、二項分布(binomial distribution)和常態分布(Normal distribusion)

伯努利分布Bernoulli distribution

伯努利分布是一種二元隨機變量的概率分佈,其中隨機變量只能取兩個值之一,通常表示為0和1,或者失敗和成功。它以試驗成功的概率 ( p ) 和失敗的概率 ( 1-p ) 為參數。

這種分佈通常用於描述只有兩種可能結果的試驗,例如硬幣投擲(也許是不公正的),其中結果可以是正面(成功)或反面(失敗),每次投擲的結果獨立且具有相同的概率。

伯努利分佈的概率質量函數(PMF)可以表示為:

其中 ( k ) 是隨機變量的取值(通常為0或1),( p ) 是成功的概率。

我們可以用下面的python 實做 (記得要先pip install 沒有的插件)

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import bernoulli

# 定義Bernoulli分佈的參數
p = 0.3  # 成功的概率

# 生成隨機樣本
data = bernoulli.rvs(p, size=1000)

# 繪製直方圖
plt.hist(data, bins=[0, 1, 2], align='left', rwidth=0.3, color='skyblue', edgecolor='black')
plt.xticks([0, 1], ['Failure', 'Success'])  
plt.xlabel('Outcome')
plt.ylabel('Frequency')  
plt.title('Random Samples of Bernoulli Distribution')  
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

# 計算概率質量函數(PMF)
x = np.array([0, 1])
pmf = bernoulli.pmf(x, p)
print("事件結果為 0 和 1 的概率分別為:", pmf)

# 計算累積分佈函數(CDF)
cdf = bernoulli.cdf(x, p)
print("事件結果小於等於 0 和 1 的累積概率分別為:", cdf)

輸出如下

可以看到,我們設定的成功概率在1000次取樣後已經接近設定的參數了,樣本數越大,成功率越接近原始值

二項分布(binomial distribution)

二項分布是統計學中常見的一種離散概率分佈,用於描述一系列獨立重複的二元試驗中成功的次數。每次試驗只有兩種可能的結果,通常表示為成功(1)和失敗(0)。二項分布的名稱來自於拉丁文的”bi”(意為”雙重”)和”nomen”(意為”名稱”),意思是兩個可能的結果。

在二項分布中,我們有兩個參數:試驗的次數 ( n ) 和成功的概率 ( p )。試驗次數 ( n ) 表示進行多少次獨立試驗,成功的概率 ( p ) 表示每次試驗成功的概率。成功的次數 ( k ) 可以是從0到 ( n ) 的任何整數。

二項分布的概率質量函數(PMF)可以用以下公式表示:

我們一樣可以用下面的python 實做 (記得要先pip install 沒有的插件)

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom

# 定義二項分佈的參數
n = 10  # 試驗次數
p = 0.5  # 成功的概率

# 生成隨機樣本
data = np.random.binomial(n, p, 1000)

# 繪製直方圖
plt.hist(data, bins=np.arange(0, n+2)-0.5, align='mid', rwidth=0.8, color='skyblue', edgecolor='black')
plt.xlabel('Success')
plt.ylabel('Frequency')
plt.title('Random Samples of Binomial Distribution (n=10, p=0.5)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

# 計算概率質量函數(PMF)
x = np.arange(0, n+1)
pmf = binom.pmf(x, n, p)
plt.stem(x, pmf, use_line_collection=True)
plt.xlabel('Number of Successes')
plt.ylabel('Probability')
plt.title('Probability Mass Function of Binomial Distribution (n=10, p=0.5)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

輸出如下

頻率:

機率質量函數:

看起來很像常態分布對吧,當二項試驗的次數 ( n ) 足夠大時(通常 ( n > 30 )),二項分佈的形狀會趨於常態分佈。這被稱為中央極限定理(CLT)。因此,當 ( n ) 較大時,二項分佈的直方圖形狀會越來越接近常態分佈。在上面的程式中,我們設置了 ( n = 10 ),所以直方圖顯示的確實與常態分佈相似,但如果我們將 ( n ) 設置為更大的值,就會更加接近常態分佈的形狀。

常態分布(Normal distribusion)

最後,我們來介紹常態分布,其有兩參數,平均值(mu)與標準差(sigma),實作如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 定義常態分佈的參數
mu = 0  # 平均值
sigma = 1  # 標準差

# 生成隨機樣本
data = np.random.normal(mu, sigma, 1000)

# 繪製直方圖
plt.hist(data, bins=30, density=True, alpha=0.6, color='skyblue', edgecolor='black')

# 繪製擬合的正態分佈曲線
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, sigma)
plt.plot(x, p, 'k', linewidth=2)

# 加上標籤和標題
plt.xlabel('Value')
plt.ylabel('Density')
plt.title('Normal Distribution')
plt.grid(True)
plt.show()

輸出如下:

看起來我們從常態分布隨機取樣的分布就很像一個鐘型曲線,這個就是常態分布

Back to Blog

返回頂端