【Numpy学习记录】np.cov详解
寫在篇前
??在概率論和統計學中,協方差用于衡量兩個變量的總體誤差。而方差是協方差的一種特殊情況,即當兩個變量是相同的情況。其定義的數學形式是:Cov(X,Y)=E[(X?E(X))(Y?E(Y))]=E[XY]?E[X]E[Y]Cov(X,Y)=E[(X-E(X))(Y-E(Y))] =E[XY]-E[X]E[Y]Cov(X,Y)=E[(X?E(X))(Y?E(Y))]=E[XY]?E[X]E[Y]
協方差數學形式
公式
cov(X,Y)=∑i=1n(Xi?Xˉ)(Yi?Yˉ)n?1cov(X,Y) = \frac{\sum_{i=1}^n(X_i-\bar{X})(Y_i-\bar{Y})}{n-1} cov(X,Y)=n?1∑i=1n?(Xi??Xˉ)(Yi??Yˉ)?
結果形式
C=(cov(1,1)cov(1,2)cov(1,3)?cov(1,n)cov(2,1)cov(2,2)cov(2,3)?cov(2,n)cov(3,1)cov(3,2)cov(3,3)?cov(3,n)?????cov(n,1)cov(n,2)cov(n,3)?cov(n,n))C = \begin{pmatrix} \color{#F00}{cov(1,1)} & \color{#0F0}{cov(1,2)} & \color{#F0F}{cov(1,3)} & \cdots & cov(1,n) \\ \color{#0F0}{cov(2,1)} & \color{#F00}{cov(2,2)} & cov(2,3) & \cdots & cov(2,n) \\ \color{#F0F}{cov(3,1)} & cov(3,2) &\color{#F00}{cov(3,3)} & \cdots & cov(3,n) \\ \vdots & \vdots& \vdots & \ddots & \vdots \\ cov(n,1) & cov(n,2) & cov(n,3) & \cdots & \color{#F00}{cov(n,n)} \end{pmatrix} C=????????cov(1,1)cov(2,1)cov(3,1)?cov(n,1)?cov(1,2)cov(2,2)cov(3,2)?cov(n,2)?cov(1,3)cov(2,3)cov(3,3)?cov(n,3)???????cov(1,n)cov(2,n)cov(3,n)?cov(n,n)?????????
協方差代碼形式
函數原型:def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)
- m:一維或則二維的數組,默認情況下每一行代表一個變量(屬性),每一列代表一個觀測
- y:與m具有一樣的形式的一組數據
- rowvar:默認為True,此時每一行代表一個變量(屬性),每一列代表一個觀測;為False時,則反之
- bias:默認為False,此時標準化時除以n-1;反之為n。其中n為觀測數
- ddof:類型是int,當其值非None時,bias參數作用將失效。當ddof=1時,將會返回無偏估計(除以n-1),即使指定了fweights和aweights參數;當ddof=0時,則返回簡單平均值。
- frequency weights:一維數組,代表每個觀測要重復的次數(相當于給觀測賦予權重)
- analytic weights:一維數組,代表觀測矢量權重。對于被認為“重要”的觀察,這些相對權重通常很大,而對于被認為不太重要的觀察,這些相對權重較小。如果ddof = 0,則可以使用權重數組將概率分配給觀測向量。
代碼示例
基本使用
import numpy as np# 計算協方差的時候,一行代表一個特征 # 下面計算cov(T, S, M) T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80]) M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88]) X = np.vstack((T, S, M)) # X每行代表一個屬性 # 每列代表一個示例,或者說觀測 print(np.cov(X))# [[ 47.71969697 122.9469697 129.59090909] # [122.9469697 370.08333333 374.59090909] # [129.59090909 374.59090909 399. ]]??重點:協方差矩陣計算的是不同維度之間的協方差,而不是不同樣本之間。拿到一個樣本矩陣,首先要明確的就是行代表什么,列代表什么。
fweights
??frequency weights:一維數組,代表每個觀測要重復的次數(相當于給觀測賦予權重)
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80]) M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88]) X = np.vstack((T, S, M)) print(np.cov(X, None, True, False, fweights=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) # 和上面例子結果一樣 # [[ 47.71969697 122.9469697 129.59090909] # [122.9469697 370.08333333 374.59090909] # [129.59090909 374.59090909 399. ]]T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80]) M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88]) X = np.vstack((T, S, M)) print(np.cov(X, None, True, False, fweights=[2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) # 結果變了,就是因為相當于在X中增加了一列[9,39,38].T # [[ 45.6025641 121.55769231 128.43589744] # [121.55769231 381.42307692 389.30769231] # [128.43589744 389.30769231 415.76923077]]T = np.array([9, 9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80]) M = np.asarray([38, 38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88]) X = np.vstack((T, S, M)) print(np.cov(X, None, True, False)) # 這樣就驗證了上面的話咯~ # [[ 45.6025641 121.55769231 128.43589744] # [121.55769231 381.42307692 389.30769231] # [128.43589744 389.30769231 415.76923077]]aweights
??很遺憾,暫時不知道它的計算方式,等有時間我仔細看看源碼怎么算的,再修正!
注意事項
參數y
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80]) M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88]) X = np.vstack((T, S, M))# 你會驚奇發現,這個結果和上面的結果一致,這就是參數 m, y,不知道為什么要設置這樣一個參數,hhh print(np.cov(X[0:1], X[1:]))# [[ 47.71969697 122.9469697 129.59090909] # [122.9469697 370.08333333 374.59090909] # [129.59090909 374.59090909 399. ]]和方差的區別
>>> a = [1,2,3,4] # 當a是一維向量時 >>> import numpy as np >>> np.cov(a) # 計算樣本方差 array(1.66666667) >>> np.var(a) # 計算總體方差 1.25下面是 cov(a) 和 var(a)的區別 >>> 1.666666666666666667*3/4 1.25 >>>總結
以上是生活随笔為你收集整理的【Numpy学习记录】np.cov详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pip修改安装镜像源
- 下一篇: 【机器学习】降维技术-PCA