中心極限定理與Python圖解
方差與z-score標準化
方差公式,也表示爲。
方差描述的是分佈的離散程度,方差爲0時則,即分佈不含有任何隨機的成分。
由於數據加常量後其方差不變,乘以後則變爲,所以對任何分佈的數據都可以做一個標準化(z-score),使得方差,期望。具體做法爲:
import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(1000)
fig, (axs1, axs2) = plt.subplots(1, 2, figsize=(9, 4))
axs1.plot(X, '.')
axs1.set_ylim(-2, 2)
axs2.hist(X, edgecolor='k', alpha=0.8)
plt.show()
print("mean:", np.round(X.mean(), 2), "std:", np.round(X.std(), 2))
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WlwuPYyG-1592485360789)(https://static01.imgkr.com/temp/bf9cd8999ba24d929380bee8f5e8835c.png)]
mean: 0.5 std: 0.29
進行z-score標準化操作(證明過程見下一小節)
W = (X - X.mean())/X.std()
mean = W.mean()
std_var = W.std()
fig, (axs1, axs2) = plt.subplots(1, 2, figsize=(9, 4))
axs1.plot(W, '.')
axs1.set_ylim(-2, 2)
axs2.hist(W, edgecolor='k', alpha=0.8)
plt.show()
print("mean:", np.round(W.mean(), 2), "std:", np.round(W.std(), 2))
mean: -0.0 std: 1.0
打印的信息顯示新的數據均值爲0,方差爲1,但是histgram顯示出每個bin(默認10個)的數據數量沒有變化。
z-score證明
假設一組數據的均值爲,方差爲,經過z-score標準化的數據。
的均值
的方差(已經得知)
標準正態分佈
對於正態分佈,其概率密度函數如下:
如果,則稱爲標準正態分佈,概率密度函數簡化爲:
def NormDist(x, mean=0, sigma=1):
assert(sigma != 0)
return np.exp(-(x-mean)**2/2)/(np.sqrt(2*np.pi)*sigma)
plt.figure(figsize=(8, 6))
xs = np.linspace(-5, 5, 100)
X = [NormDist(i) for i in xs]
plt.plot(xs, X, '-', label=r'$\frac{1}{\sqrt{2\pi}\sigma}exp(\frac{-x^2}{2})$')
X = [np.exp(-i**2/2) for i in xs]
plt.plot(xs, X, '--', label=r'$exp(\frac{-x^2}{2})$')
X = [np.exp(-i**2) for i in xs]
plt.plot(xs, X, '--', label=r'$exp(-x^2)$')
plt.legend(fontsize=14)
plt.show()
從上圖可以看出:1. 由於的存在使得在0點處左右對稱,並且越接近於0越大;2. 而和的指數除以使得其面積(在x軸上積分)爲1,滿足了概率密度函數積分爲1的性質。
z-score變換爲標準正態分佈
正態分佈經過z-score標準化後會變成標準正態分佈。證明過程如下
正態分佈概率密度函數
其精髓和意義就是通過對積分,可以得到在任意區間的概率,例如的概率:
經過z-score標準化的新數據爲,那麼的概率:
將代入積分公式,替換上限:
可是我們要求的是的概率,由於,只需要將只要代入積分公式替換掉即可:
注意兩點:
- 積分的上限爲,新變量的上限爲
- 對兩邊求導,得到
至此,證明得到z-score變化後的數據服從標準正態分佈。
中心極限定理
The central limit theorem in statistics states that, given a sufficiently large sample size, the sampling distribution of the mean for a variable will approximate a normal distribution regardless of that variable’s distribution in the population.
名詞解釋
在統計學中,有一些專用名詞不能弄混淆,特別是我們平時說的“樣本”在這裏並不是指單個數據,參見Central Limit Theorem Explained
- 總體(population):研究對象的整個羣體(the complete set of all objects or people of interest)
- 樣本(sample):從總體中選取的一部分數據(a subset of the entire population)
- 樣本數量(the number of samples):有多少個樣本。
- 樣本大小/樣本容量(sample size):每個樣本里包含多少個數據。
- 抽樣分佈(sampling distribution):將樣本平均值的分佈可視化。
定義
對於獨立同分布的變量,其中,這組樣本的均值表示爲:
中心極限定理研究的就是這個的分佈情況,而不是的分佈情況,因爲現實中很多數據我們是無法獲得其總體(population)分佈情況的,而中心極限定理可以幫助我們分析其均值位置。
不同的或者不同的樣本都會影響,直覺上是和有關的,而且是圍繞着的。如果對這組數據做z-score標準化得到,標準化後的樣本均值
由大數定律(大數定律、中心極限定理與格里文科定理)可知,當時,以概率1收斂於期望,因此得到
現在給出中心極限定理的定義:
公式左邊相當於對做了類似z-score的處理,減去總體均值,併除以,右邊就是標準正態分佈的概率密度函數的積分,也就是說當樣本容量極大時,樣本均值的抽樣分佈趨近於期望爲,標準差爲的正態分佈。如果將分子分母同乘以,那麼可以得到和的表示形式
證明過程將的特徵函數在0點泰勒展開,得到了和標準正態分佈一樣的特徵函函數。
單次採樣
均勻分佈
以均勻分佈np.random.rand()
爲例,一次採樣1000個值,可以看到樣本均值接近0.5,並且histgram(默認10個bin)中每個bin的值都接近1000/10=100
sample_size = 1000 # 採樣個數
number_of_sample = 1 # 採樣次數
np.random.seed(0)
X = np.random.rand(number_of_sample, sample_size)
mean = X.mean(axis=1)
fig, axs = plt.subplots(1, 2, figsize=(9, 4))
# sample values
axs[0].plot(X[0], '.')
axs[0].set_ylim(-1, 2)
axs[0].set_title('sample values')
# histgram of X
axs[1].hist(X[0], edgecolor='k', alpha=0.8)
axs[1].set_title('histgram of $X$')
plt.show()
print('mean:', mean)
mean: [0.49592153]
偏正態分佈
如果用正態分佈實驗,結果可能不能很好的展示中心極限定理。我們直接用SciPy裏的skewnorm偏正態分佈,概率密度函數爲skewnorm.pdf(x, a) = 2 * norm.pdf(x) * norm.cdf(a*x)
。
from scipy.stats import skewnorm
import matplotlib.pyplot as plt
a = 4
fig, ax = plt.subplots(1, 1)
mean, var, skew, kurt = skewnorm.stats(a, moments='mvsk')
x = np.linspace(skewnorm.ppf(0.01, a), skewnorm.ppf(0.99, a), 100)
ax.plot(x, skewnorm.pdf(x, a), 'r-', lw=5, alpha=0.6, label='skewnorm pdf')
print('E(X) =', mean)
E(X) = 0.7740617226446519
打印的結果顯示這個分佈均值約等於0.774,我們採樣1000個值看看其分佈情況。
r = skewnorm.rvs(a, size=1000)
fig, axs = plt.subplots(1, 2, figsize=(9, 4))
# sample values
axs[0].plot(r, '.')
axs[0].set_ylim(-2, 5)
axs[0].set_title('sample values')
# histgram of X
axs[1].hist(r, edgecolor='k', alpha=0.8)
axs[1].set_title('histgram of $X$')
print('mean:', r.mean())
mean: 0.7426786528215207
多次採樣
均勻分佈
我們分別測試的情況,每種情況都採集100000次,並畫出每種情況下均值的分佈圖(已歸一化)。從圖中可以看出,雖然樣本容量很小,但是其均值的分佈圖已經是正態分佈,這和均勻分佈本身對稱有關係。當時候已經很好了。
sample_size = [3, 10, 30, 100] # 每次採樣個數
number_of_sample = 100000 # 採樣次數
plt.figure(figsize=(8,6))
for i, ss in enumerate(sample_size):
Xs = np.random.rand(number_of_sample, ss)
h, b = np.histogram(Xs.mean(axis=1), bins=50, density=True)
b = (b[:-1] + b[1:]) / 2.
plt.plot(b, h, '-', label=f'sample size = {ss}')
plt.legend()
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Iw3aDmtH-1592485360810)(https://static01.imgkr.com/temp/455608657cea4ca8867401ab1e077261.png)]
偏正態分佈
同均勻分佈一樣,仍然測試的情況,但是注意,由於樣本容量太小,其均值分佈類似於總體數據的偏正態分佈,而就好了很多。
sample_size = [3, 10, 30, 100] # 每次採樣個數
number_of_sample = 100000 # 採樣次數
plt.figure(figsize=(8,6))
for i, ss in enumerate(sample_size):
Xs = skewnorm.rvs(4, size=(number_of_sample, ss))
h, b = np.histogram(Xs.mean(axis=1), bins=50, density=True)
b = (b[:-1] + b[1:]) / 2.
plt.plot(b, h, '-', label=f'sample size = {ss}')
plt.legend()
練習題
e.g.1 某炮兵陣地對敵人的防禦地段進行100次射擊,每次射擊中炮彈的命中數是一個隨機變量,其期望爲2,方差爲1.69,求在100次射擊中有180顆到220顆炮彈命中目標的概率。
解:設表示第次設計命中的炮彈數,則,因爲100很大,所以根據中心極限定理可以認爲近似服從,,所以