1. 程式人生 > >numpy中的方差、協方差、相關系數

numpy中的方差、協方差、相關系數

degree log mes python axis 維數 關於 數據 如果

一、np.var

數學上學過方差:
$$D(X)=\sum_{i\in [0,n)} ({x-\bar{x}})^2 $$
np.var實際上是均方差。
函數原型:numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<class numpy._globals._NoValue>)
計算張量a在axis軸上的方差

  • a:一個ndarray,不一定是一維
  • axis:可取值為None,int,int元組。當取值為None時,會把張量a展平成一維數組;當指定一個或多個int時,沿著axis指定的軸計算方差,其它軸的形狀會保留。
  • dtype:在計算方差的時候使用的數據類型,如果a是int類型的張量,計算方差時也會使用float32類型
  • out:放置計算結果的數組,主要用於節省空間,out的維度必須保證正確
  • ddof:int,ddof是“Delta Degrees of Freedom”,表示自由度的個數,在計算方差時,分子是各個值和均值的差的平方之和,分母為(N-ddof)
  • keepdims:是否保留a的形狀

返回值variance是一個ndarray

import numpy as np

a = np.random.randint(0, 10, (2, 3))
print(a)
print(np.var(a))
print(np.var(a, axis=0))
print(np.var(a, axis=1))
print(np.var(a, keepdims=True))
print(np.var(a, axis=0, keepdims=True))
print(np.var(a, axis=(0, 1)))

輸出為

[[2 1 5]
 [7 3 0]]
5.666666666666667
[6.25 1.   6.25]
[2.88888889 8.22222222]
[[5.66666667]]
[[6.25 1.   6.25]]
5.666666666666667

關於ddof

import numpy as np

a = np.random.randint(0, 10, 4)
print(np.var(a), '=',np.sum((a - np.mean(a)) ** 2) / len(a))
ddof = 1
print(np.var(a, ddof=ddof), '=',np.sum((a - np.mean(a)) ** 2) / (len(a) - ddof))

二、np.cov

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)

數學上的協方差的定義:
$$ cov(X,Y)= (X-\bar{X})\cdot (Y-\bar{Y}) $$
此式中,X和Y皆為向量。
方差是特殊的協方差D(X)=cov(X,X)
但是,D(X)=cov(X,X)這個式子是一種有偏估計,真正的無偏估計分母是(len(a)-1)。

a = [1, 2, 3, 4, 6] 
print(np.cov(a), np.var(a) * len(a) / (len(a) - 1))

三、np.correlate

相關系數的定義
$$\ro(X,Y)=\frac{cov(X,Y)}{\sqrt{cov(X,X)\times cov(Y,Y)}}$$
函數原型:numpy.corrcoef(x, y=None, rowvar=True, bias=<class ‘numpy._globals._NoValue‘>, ddof=<class ‘numpy._globals._NoValue‘>)

參考資料

PCA實現

numpy中的方差、協方差、相關系數