numpy中的方差、協方差、相關系數
阿新 • • 發佈:2019-04-12
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中的方差、協方差、相關系數