numpy.cov()和numpy.var()的用法
在PCA中涉及到了方差var和協(xié)方差cov,這里簡(jiǎn)單總結(jié)下。
首先:均值,樣本方差,樣本協(xié)方差的公式為
均值:Xˉ=1N∑Ni=1Xi
方差:var=1N∑Ni=1(Xi?Xˉ)2
樣本方差:S=1N?1∑Ni=1(Xi?Xˉ)2
樣本協(xié)方差:cov=1N?1∑Ni=1(Xi?Xˉ)(Yi?Yˉ)
首先我們應(yīng)該清楚的區(qū)分兩個(gè)概念,即方差和樣本方差的無(wú)偏估計(jì):
方差公式中分母上是N;樣本方差無(wú)偏估計(jì)公式中分母上是N-1 (N為樣本個(gè)數(shù))。
其中樣本方差公式中為什么除的n-1而不是n?樣本協(xié)方差同樣除的是n-1而不是n?如果除的是n,那么求的方差就不是隨機(jī)抽取變量組成樣本的方差,而是整個(gè)空間的方差。
1. 求協(xié)方差
協(xié)方差矩陣計(jì)算的是不同維度之間的協(xié)方差,而不是不同樣本之間的。理解協(xié)方差矩陣的關(guān)鍵就在于牢記它計(jì)算的是不同維度之間的協(xié)方差,而不是不同樣本之間,拿到一個(gè)樣本矩陣,我們最先要明確的就是一行是一個(gè)樣本還是一個(gè)維度。
例1.1
>>> X=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]]) >>> np.cov(X) array([[ 7. , 4.5 , 4. , -0.5 ],[ 4.5 , 10.33333333, 11.5 , -7.16666667],[ 4. , 11.5 , 13. , -8.5 ],[ -0.5 , -7.16666667, -8.5 , 6.33333333]])在numpy中,將x的每一列視作一個(gè)獨(dú)立的變量,因此這里一共有3個(gè)4維的變量,因此將會(huì)輸出一個(gè)4*4的協(xié)方差矩陣 ,其中對(duì)角線元素是每個(gè)維度的方差,非對(duì)角線上的元素則是不同維度間的協(xié)方差。
例1.2 下面是一個(gè)協(xié)方差實(shí)現(xiàn)的另一個(gè)簡(jiǎn)單例子:
>>> import numpy as np >>> x = np.array([[0, 2], [1, 1], [2, 0]]).T >>> x array([[0, 1, 2],[2, 1, 0]]) >>> np.cov(x) # 兩個(gè)變量x0和x1,有很大的相關(guān)性,但是相反的方向 array([[ 1., -1.],[-1., 1.]]) >>> x = [-2.1, -1, 4.3] >>> y = [3, 1.1, 0.12] >>> X = np.vstack((x,y)) >>> X array([[-2.1 , -1. , 4.3 ],[ 3. , 1.1 , 0.12]]) >>> np.cov(X) array([[ 11.71 , -4.286 ],[ -4.286 , 2.14413333]]) >>> np.cov(x, y) array([[ 11.71 , -4.286 ],[ -4.286 , 2.14413333]]) >>> np.cov(x) array(11.709999999999999)1.3 numpy中cov(x)與cover(x,y)的區(qū)別
示例:
>>> X=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]]) >>> X array([[1, 5, 6],[4, 3, 9],[4, 2, 9],[4, 7, 2]]) >>> x=X[0:2] >>> y=X[2:4] >>> np.cov(X) array([[ 7. , 4.5 , 4. , -0.5 ],[ 4.5, 10.33333333, 11.5 , -7.16666667],[ 4. , 11.5 , 13. , -8.5 ],[ -0.5, -7.16666667, -8.5 , 6.33333333]]) >>> np.cov(x,y) array([[ 7. , 4.5 , 4. , -0.5 ],[ 4.5 , 10.33333333, 11.5 , -7.16666667],[ 4. , 11.5 , 13. , -8.5 ],[ -0.5 , -7.16666667, -8.5 , 6.33333333]]) >>>可以看出兩者的輸出是相同的。因此np.cov(X)其實(shí)就是把np.cov(x,y)中兩個(gè)變量所有的維度縱向拼接在一起作為X參與運(yùn)算。
2.由協(xié)方差矩陣求其相關(guān)的矩陣:
假設(shè)協(xié)方差矩陣sigma
>>> sigma=np.array([[4,1,2],[2,3,4],[2,3,5]]) >>> sigma array([[4, 1, 2],[2, 3, 4],[2, 3, 5]]) >>> p=len(sigma) # 得出協(xié)方差的長(zhǎng)度 >>> p 3 >>> e=np.eye(p) >>> e array([[ 1., 0., 0.],[ 0., 1., 0.],[ 0., 0., 1.]]) >>> variance=e*sigma # 得出協(xié)方差矩陣的對(duì)角線元素,即方差矩陣 >>> variance array([[ 4., 0., 0.],[ 0., 3., 0.],[ 0., 0., 5.]]) >>> v=np.power(variance,0.5) # 得出標(biāo)準(zhǔn)差矩陣 >>> v array([[ 2. , 0. , 0. ],[ 0. , 1.73205081, 0. ],[ 0. , 0. , 2.23606798]]) >>> I=np.linalg.inv(v) # 得出標(biāo)準(zhǔn)差的逆矩陣 >>> I array([[ 0.5 , 0. , 0. ],[ 0. , 0.57735027, 0. ],[ 0. , 0. , 0.4472136 ]]) >>> cov=I.dot(sigma).dot(I) # 得出相關(guān)系數(shù)矩陣 >>> cov array([[ 1. , 0.28867513, 0.4472136 ],[ 0.57735027, 1. , 1.03279556],[ 0.4472136 , 0.77459667, 1. ]]) >>>其中對(duì)角線元素是每個(gè)維度的方差,非對(duì)角線上的元素則是不同維度間的協(xié)方差
3. 計(jì)算矩陣的方差
在數(shù)學(xué)中,每一維度指的是列,例如:[1,2,3]維度是三維的,但是在array中,每一維度指的是一個(gè)array,也就是一個(gè)樣本。
計(jì)算方差的公式為:
這里計(jì)算的方差不是如方差公式s<script id="MathJax-Element-286" type="math/tex">s</script>那樣除以N-1,在numpy里是上述的var。
4. 在matlab中的使用
4.1 matlab 統(tǒng)計(jì)基本函數(shù) var方差
參考:(http://blog.csdn.net/tong_huijiao/article/details/54018019)
函數(shù)名稱: var
函數(shù)功能:求解方差
函數(shù)用法:
- var(X) 【與var(X,0)相同 】
- var(X,W)
- var(X,W,dim)
注:var(X,W)
- W可以取0或1:取0求樣本方差的無(wú)偏估計(jì)值(除以N-1),對(duì)應(yīng)取1求得的是方差(除以N)
- W也可以是向量,但必須與X中的第一個(gè)維度數(shù)相同,即length(W)= size(X,1)
var(X ,0 ,dim) :除以N-1 ;dim =1 對(duì)每列操作 dim = 2 對(duì)每行操作
var(X ,1 ,dim) : 除以N ;dim =1 對(duì)每列操作 dim = 2 對(duì)每行操作
var(X,W,dim) : 關(guān)于W取向量時(shí),把W看做X中觀察值發(fā)生的次數(shù)(或者說(shuō)概率也行)
1.對(duì)于X是向量時(shí):把向量中每個(gè)元素看做一個(gè)樣本
var(X) 或者 var(x,0)函數(shù)輸出這個(gè)向量中元素的樣本方差的無(wú)偏估計(jì)值,var(x,1)輸出的是樣本方差 。
2. 對(duì)于X是矩陣時(shí)
把每行看做一個(gè)觀察值,每列看做一個(gè)變量,函數(shù)輸出一個(gè)行向量,每個(gè)元素計(jì)算的是該列的方差
3. 對(duì)于var(X ,0 ,dim) 或者 var(X ,1 ,dim)
前面已說(shuō) 0 對(duì)應(yīng) 除以N-1; 1對(duì)應(yīng)除以N
dim 指維度信息,默認(rèn)為1,dim =1 就指對(duì)每列操作; dim =2 就指對(duì)每行操作。
4 . 對(duì)于 var(X,W)、var(X,W,dim) 中W為向量的情況:
把W看做X中對(duì)應(yīng)觀察值發(fā)生的次數(shù)(或者說(shuō)概率也行)處理
4.2 MATLAB中cov函數(shù)的用法
參考:(http://blog.sina.com.cn/s/blog_9e67285801010twv.html)
函數(shù)名稱:cov
函數(shù)功能:求協(xié)方差矩陣
函數(shù)用法:
- cov(X) :cov(X,0) = cov(X)
- cov(X,Y) :X,Y必須是各維數(shù)都相同的矩陣
- cov(X,1) :除以N而不是N-1
- cov(X,Y,1) : 除以N而不是N-1
1.如果X是向量
cov(X)輸出的是這個(gè)向量的方差
2. X是一個(gè)矩陣來(lái)
matlab把每行看做一個(gè)觀察值,把每列當(dāng)做一個(gè)變量.也就是說(shuō)對(duì)于一個(gè)4*3的矩陣求協(xié)方差矩陣,matlab會(huì)認(rèn)為存在三個(gè)變量,即會(huì)求出一個(gè)3*3的協(xié)方差矩陣。其中,對(duì)角線元素為對(duì)應(yīng)變量的方差無(wú)偏估計(jì)值,其他位置為對(duì)應(yīng)變量間的協(xié)方差無(wú)偏估計(jì)值(即除的是N-1)
3.對(duì)于cov(X,Y)
X、Y必須是各維數(shù)都相等的矩陣,其功能是把X中所有元素看做一個(gè)變量的樣本,Y中所有元素看做另外一個(gè)變量的樣本,把矩陣中每個(gè)對(duì)應(yīng)位置看做一個(gè)聯(lián)合觀察值,函數(shù)實(shí)現(xiàn)的是求出兩個(gè)變量的協(xié)方差矩陣。
4. cov(X,1) 和 cov(X,Y,1)
與之前的求解過(guò)程一致。不同的是,其求出的是協(xié)方差,而不是樣本的協(xié)方差無(wú)偏估計(jì)值,即其除以的是N 而不是N-1。
先到這里。。。
總結(jié)
以上是生活随笔為你收集整理的numpy.cov()和numpy.var()的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 预测数值型数据:回归 源码分析(2)
- 下一篇: 招财进宝(说一说招财进宝的简介)