協方差與相關係數
1.協方差
如果兩個變量的變化趨勢一致,也就是說如果其中一個大於自身的期望值時另外一個也大於自身的期望值,那麼兩個變量之間的協方差就是正值;如果兩個變量的變化趨勢相反,即其中一個變量大於自身的期望值時另外一個卻小於自身的期望值,那麼兩個變量之間的協方差就是負值。
可以通俗的理解爲:兩個變量在變化過程中是同方向變化?還是反方向變化?同向或反向程度如何?
你變大,同時我也變大,說明兩個變量是同向變化的,這時協方差就是正的;
你變大,同時我變小,說明兩個變量是反向變化的,這時協方差就是負的;
從數值來看,協方差的數值越大,兩個變量同向程度也就越大。反之亦然。
import numpy as np
a = np.array([1,2,3])
b = np.array([4,3,4])
x = np.vstack((a,b))
np.cov(a, b)
np.cov(a, b, bias=True)
np.cov(x)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
輸出:
>>> np.cov(a, b)
array([[ 1. , 0. ],
[ 0. , 0.33333333]])
>>> np.cov(a, b, bias=True)
array([[ 0.66666667, 0. ],
[ 0. , 0.22222222]])
>>> np.cov(x)
array([[ 1. , 0. ],
[ 0. , 0.33333333]])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
這裏使用numpy庫的cov函數來計算協方差,輸出結果爲一個協方差矩陣,results[i][j]表示第i個變量與第j個變量的協方差,比如np.cov(x)的結果爲
>>> np.cov(x)
array([[ 1. , 0. ],
[ 0. , 0.33333333]])
- 1
- 2
- 3
x爲變量矩陣,x的第 i 行表示第 i 個隨機變量,這裏第0個隨機變量與第0個隨機變量的協方差爲1,第0個隨機變量與第1個隨機變量的協方差爲0,第1個隨機變量與第0個隨機變量的協方差爲0,第1個隨機變量與第1個隨機變量的協方差爲0.33333333.
還有一點就是bais參數的意義,默認爲False,那麼計算均值的時候除以 n - 1,如果設爲True,那麼計算均值的時候除以n,其中n爲隨機變量的維度數。具體理論涉及到統計學知識,可以參考知乎回答。
numpy的cov函數使用的三點:
- 變量矩陣的一行表示一個隨機變量;
- bais參數控制計算時除以n-1還是n, True表示除以n,False表示除以n-1;
- 輸出結果是一個協方差矩陣, results[i][j]表示第i個隨機變量與第j個隨機變量的協方差.
2. 相關係數
相關係數是用以反映變量之間相關關係密切程度的統計指標。相關係數也可以看成協方差:一種剔除了兩個變量量綱影響、標準化後的特殊協方差,它消除了兩個變量變化幅度的影響,而只是單純反應兩個變量每單位變化時的相似程度。
並且
其中,δx,δyδx,δy表示X,Y的方差。
import numpy as np
a = np.array([1,2,3])
b = np.array([2,5,8])
x = np.vstack((a,b))
np.corrcoef(a, b)
np.corrcoef(x)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
輸出
>>> np.corrcoef(a, b)
array([[ 1., 1.],
[ 1., 1.]])
>>> np.corrcoef(x)
array([[ 1., 1.],
[ 1., 1.]])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
numpy中函數corrcoef的用法與函數cov的用法相似,只是corrcoef中bais參數不起作用。
numpy的cov函數使用的兩點:
- 變量矩陣的一行表示一個隨機變量;
- 輸出結果是一個相關係數矩陣, results[i][j]表示第i個隨機變量與第j個隨機變量的相關係數.