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