1. 程式人生 > >使用Python計算方差協方差相關係數

使用Python計算方差協方差相關係數

使用Python計算方差,協方差和相關係數

文章目錄

數學定義

期望

設隨機變數 X X 只取有限個可能值 a

i ( i = 0 , 1 , . .
. , m ) a_i (i=0, 1, ..., m) ,其概率分佈為 P ( X
= a i ) = p i P (X = a_i) = p_i
. 則 X X 的數學期望,記為 E ( X ) E(X) E X EX ,定義為:

E ( X ) = i a i p i E(X) = \sum\limits_ia_ip_i

方差

X X 為隨機變數,分佈為 F F ,則

V a r ( X ) = E ( X E X ) 2 Var(X) = E(X-EX)^2

稱為 X X (或分佈 F F )的方差,其平方根 V a r ( X ) \sqrt{Var(X)} 稱為 X X (或分佈 F F )的標準差.

方差和標準差是刻畫隨機變數在其中心位置附近散佈程度的數字特徵。

注意:樣本方差和總體方差的區別

統計學上對於樣本方差的無偏估計使用如下公式計算:

s 2 = 1 n 1 i = 1 n ( x i x ˉ ) 2 s^2 = \frac{1}{n-1} \sum\limits_{i=1}^n(x_i -\bar{x})^2

前面有一個係數 1 n 1 \frac{1}{n-1} ,當時當樣本數量很大的時候, n n 1 \frac{n}{n-1} 近似為1,可以直接使用總體方差公式進行計算。

協方差

協方差用來刻畫兩個隨機變數 X , Y X, Y 之間的相關性,定義為

C o v ( X , Y ) = E [ ( X E X ) ( Y E Y ) ] Cov(X, Y) = E[(X - EX)(Y-EY)]

如果協方差為正,說明X,Y同向變化,協方差越大說明同向程度越高;如果協方差為負,說明X,Y反向運動,協方差越小說明反向程度越高

相關係數

相關係數可以理解為標準化以後的協方差,設 X X 的標準差為 σ x \sigma_x Y Y 的標準差為 σ y \sigma_y 定義為

ρ = C o v ( X , Y ) σ x σ y \rho = \frac{Cov(X, Y)}{\sigma_x\sigma_y}

相關係數消除了兩個變數變化幅度的影響,而只是單純反應兩個變數每單位變化時的相似程度

協方差矩陣

協方差只能表示兩個隨機變數的相關程度(二維問題),對於大於二維的隨機變數,可以使用協方差矩陣表示.

協方差矩陣的每一個值就是對應下標的兩個隨機變數的協方差

對於三維協方差矩陣, C = [ C o v ( X , X ) C o v ( X , Y ) C o v ( X , Z ) C o v ( Y , X ) C o v ( Y , Y ) C o v ( X , Y ) C o v ( Z , X ) C o v ( Z , Y ) C o v ( Z , Z ) ] C=\begin{bmatrix}Cov(X, X) & Cov(X, Y) & Cov(X, Z) \\ Cov(Y, X) & Cov(Y, Y) & Cov(X, Y) \\ Cov(Z, X) & Cov(Z, Y) & Cov(Z, Z)\end{bmatrix}

使用NumPy包計算

import numpy as np

# 隨機生成兩個樣本
x = np.random.randint(0, 9, 1000)
y = np.random.randint(0, 9, 1000)

# 計算平均值
mx = x.mean()
my = y.mean()

# 計算標準差
stdx = x.std()
stdy = y.std()

# 計算協方差矩陣
covxy = np.cov(x, y)
print(covxy)

# 我們可以手動進行驗證
# covx等於covxy[0, 0], covy等於covxy[1, 1]
# 我們這裡的計算結果應該是約等於,因為我們在計算的時候是使用的總體方差(總體方差和樣本方差是稍微有點區別的)
covx = np.mean((x - x.mean()) ** 2) 
covy = np.mean((y - y.mean()) ** 2) 
print(covx)
print(covy)
# 這裡計算的covxy等於上面的covxy[0, 1]和covxy[1, 0],三者相等
covxy = np.mean((x - x.mean()) * (y - y.mean()))
print(covxy)

# 下面計算的是相關係數矩陣(和上面的協方差矩陣是類似的)
coefxy = np.corrcoef(x, y)
print(coefxy)

一組可能的輸出結果:

[[6.83907508 0.10925926]
 [0.10925926 6.53390891]]
6.832236
6.527375
0.10914999999999989
[[1.         0.01634455]
 [0.01634455 1.        ]]