【Numpy学习记录】np.cov详解
寫(xiě)在篇前
??在概率論和統(tǒng)計(jì)學(xué)中,協(xié)方差用于衡量?jī)蓚€(gè)變量的總體誤差。而方差是協(xié)方差的一種特殊情況,即當(dāng)兩個(gè)變量是相同的情況。其定義的數(shù)學(xué)形式是: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]
協(xié)方差數(shù)學(xué)形式
公式
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ˉ)?
結(jié)果形式
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)?????????
協(xié)方差代碼形式
函數(shù)原型:def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)
- m:一維或則二維的數(shù)組,默認(rèn)情況下每一行代表一個(gè)變量(屬性),每一列代表一個(gè)觀測(cè)
- y:與m具有一樣的形式的一組數(shù)據(jù)
- rowvar:默認(rèn)為T(mén)rue,此時(shí)每一行代表一個(gè)變量(屬性),每一列代表一個(gè)觀測(cè);為False時(shí),則反之
- bias:默認(rèn)為False,此時(shí)標(biāo)準(zhǔn)化時(shí)除以n-1;反之為n。其中n為觀測(cè)數(shù)
- ddof:類(lèi)型是int,當(dāng)其值非None時(shí),bias參數(shù)作用將失效。當(dāng)ddof=1時(shí),將會(huì)返回?zé)o偏估計(jì)(除以n-1),即使指定了fweights和aweights參數(shù);當(dāng)ddof=0時(shí),則返回簡(jiǎn)單平均值。
- frequency weights:一維數(shù)組,代表每個(gè)觀測(cè)要重復(fù)的次數(shù)(相當(dāng)于給觀測(cè)賦予權(quán)重)
- analytic weights:一維數(shù)組,代表觀測(cè)矢量權(quán)重。對(duì)于被認(rèn)為“重要”的觀察,這些相對(duì)權(quán)重通常很大,而對(duì)于被認(rèn)為不太重要的觀察,這些相對(duì)權(quán)重較小。如果ddof = 0,則可以使用權(quán)重?cái)?shù)組將概率分配給觀測(cè)向量。
代碼示例
基本使用
import numpy as np# 計(jì)算協(xié)方差的時(shí)候,一行代表一個(gè)特征 # 下面計(jì)算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每行代表一個(gè)屬性 # 每列代表一個(gè)示例,或者說(shuō)觀測(cè) print(np.cov(X))# [[ 47.71969697 122.9469697 129.59090909] # [122.9469697 370.08333333 374.59090909] # [129.59090909 374.59090909 399. ]]??重點(diǎn):協(xié)方差矩陣計(jì)算的是不同維度之間的協(xié)方差,而不是不同樣本之間。拿到一個(gè)樣本矩陣,首先要明確的就是行代表什么,列代表什么。
fweights
??frequency weights:一維數(shù)組,代表每個(gè)觀測(cè)要重復(fù)的次數(shù)(相當(dāng)于給觀測(cè)賦予權(quán)重)
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])) # 和上面例子結(jié)果一樣 # [[ 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])) # 結(jié)果變了,就是因?yàn)橄喈?dāng)于在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)) # 這樣就驗(yàn)證了上面的話(huà)咯~ # [[ 45.6025641 121.55769231 128.43589744] # [121.55769231 381.42307692 389.30769231] # [128.43589744 389.30769231 415.76923077]]aweights
??很遺憾,暫時(shí)不知道它的計(jì)算方式,等有時(shí)間我仔細(xì)看看源碼怎么算的,再修正!
注意事項(xiàng)
參數(shù)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))# 你會(huì)驚奇發(fā)現(xiàn),這個(gè)結(jié)果和上面的結(jié)果一致,這就是參數(shù) m, y,不知道為什么要設(shè)置這樣一個(gè)參數(shù),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. ]]和方差的區(qū)別
>>> a = [1,2,3,4] # 當(dāng)a是一維向量時(shí) >>> import numpy as np >>> np.cov(a) # 計(jì)算樣本方差 array(1.66666667) >>> np.var(a) # 計(jì)算總體方差 1.25下面是 cov(a) 和 var(a)的區(qū)別 >>> 1.666666666666666667*3/4 1.25 >>>總結(jié)
以上是生活随笔為你收集整理的【Numpy学习记录】np.cov详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python pip修改安装镜像源
- 下一篇: 【机器学习】降维技术-PCA