天天看點

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

1. 期望

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...
python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

2. 方差

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...
python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...
python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

3. 協方差和相關系數

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...
python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

協方差(或者相關系數)如果是正的,表明X和Y之間同時增加或減小;如果是負的,表明X和Y之間有一個增加而另一個減小;如果它的值為0,則表明X和Y之間是獨立的。

4. 協方差矩陣

在機器學習中,計算兩個特征X、Y(都是向量)的協方差公式為

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

式中n表示n個樣本。兩個特征X、Y之間的協方差矩陣為

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

如果有多個特征(特征1, 特征2, 特征3,...,特征N),它們的協方差矩陣:

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

下面以兩個特征為例計算協方差矩陣:

import numpy as np

m = 8 # 8個樣本

n = 2 # 2個特征

featuremat = np.random.randint(1, 100, [m, n])

mean0 = np.mean(featuremat[:, 0]) # 求第一個特征列的均值,用于資料中心化

mean1 = np.mean(featuremat[:, 1]) # 求第二個特征列的均值,用于資料中心化

cov = np.sum((featuremat[:, 0] - mean0) * (featuremat[:, 1] - mean1))/(m-1)

print('cov: ', cov)

print('cov matrix: ')

print(np.cov(featuremat.T)) # 計算特征列之間的協方差矩陣

運作結果:

cov: 316.0357142857143

cov matrix:

[[646.26785714 316.03571429]

[316.03571429 883.92857143]]

在樣本資料矩陣X(注意上文中我用X表示一個特征,這裡我用X表示整個樣本資料矩陣)中,如果資料是按行排列的,即一行是一個樣本,一列是一個特征,那麼協方差矩陣計算公式為

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

如果資料是按列排列的,即一列是一個樣本,一行是一個特征,那麼協方差矩陣計算公式為

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

在機器學習中,了解協方差矩陣的關鍵在于牢記它計算的是同一個樣本不同特征次元之間的協方差,而不是不同樣本之間。拿到樣本矩陣之後,我們首先要明确一行是樣本還是特征次元。下圖可幫助了解:

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

此外,在統計學與機率論中,協方差矩陣的計算好像有所不同(存疑),其每個元素是各個向量元素之間的協方差,這是從标量随機變量到高次元随機向量的自然推廣:

python 相關系數矩陣_期望,方差,協方差,相關系數,協方差矩陣,相關系數矩陣,以及numpy實作...

5.相關系數矩陣

相關系數矩陣的計算原理和協方差矩陣的差不多,隻不過前者計算的是相關系數,後者計算的是協方差,而相關系數和協方差的關系,在前面的第3小節介紹過了。下面用python-numpy實作一個簡單的求相關系數矩陣的例子,例子中一行表示一個樣本,一清單示一個特征:

import numpy as np

featuremat = np.random.rand(8, 2) # 8個樣本,2個特征

# compute mean

mean0 = np.mean(featuremat[:, 0]) # 求第一個特征列的均值

mean1 = np.mean(featuremat[:, 1]) # 求第二個特征列的均值

# comupte standard deviation

std0 = np.std(featuremat[:, 0])

std1 = np.std(featuremat[:, 1])

corref = np.mean((featuremat[:, 0]-mean0)*(featuremat[:, 1]-mean1)) / (std0*std1)

print('corref: ', corref)

print('corref matrix: ')

print(np.corrcoef(featuremat.T)) # 計算特征之間的相關系數矩陣

運作結果:

corref: -0.11352065914068718

corref matrix:

[[ 1. -0.11352066]

[-0.11352066 1. ]]

參考文獻

[1] 機率論與數理統計,黃清龍等,北京大學出版社

[2]《機器學習算法原理與程式設計實踐》鄭捷,第一章第三節