numpy.cov()和numpy.var()的用法

本文详细解析了PCA中的方差与协方差概念,包括它们的计算公式及在Python和Matlab中的应用。并通过实例展示了如何利用这些统计量进行数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在PCA中涉及到了方差var和协方差cov,这里简单总结下。
首先:均值,样本方差,样本协方差的公式为

均值: X¯=1NNi=1Xi

方差: var=1NNi=1(XiX¯)2

样本方差: S=1N1Ni=1(XiX¯)2

样本协方差: cov=1N1Ni=1(XiX¯)(YiY¯)

首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:
方差公式中分母上是N;样本方差无偏估计公式中分母上是N-1 (N为样本个数)。

其中样本方差公式中为什么除的n-1而不是n?样本协方差同样除的是n-1而不是n?如果除的是n,那么求的方差就不是随机抽取变量组成样本的方差,而是整个空间的方差。

1. 求协方差

协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度。

例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的协方差矩阵 ,其中对角线元素是每个维度的方差,非对角线上的元素则是不同维度间的协方差。

例1.2 下面是一个协方差实现的另一个简单例子:

>>> 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)的区别

示例:

>>> 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.由协方差矩阵求其相关的矩阵:

假设协方差矩阵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)  # 得出协方差的长度 
>>> p
3
>>> e=np.eye(p) 
>>> e
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
>>> variance=e*sigma  # 得出协方差矩阵的对角线元素,即方差矩阵
>>> 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) # 得出相关系数矩阵
>>> cov
array([[ 1.        ,  0.28867513,  0.4472136 ],
       [ 0.57735027,  1.        ,  1.03279556],
       [ 0.4472136 ,  0.77459667,  1.        ]])
>>> 

其中对角线元素是每个维度的方差,非对角线上的元素则是不同维度间的协方差

3. 计算矩阵的方差

在数学中,每一维度指的是列,例如:[1,2,3]维度是三维的,但是在array中,每一维度指的是一个array,也就是一个样本。
计算方差的公式为:

>>> a=np.array([1,2,7])
>>> a
array([1, 2, 7])
>>> a.var()
6.8888888888888884
>>> 

这里计算的方差不是如方差公式 s <script id="MathJax-Element-286" type="math/tex">s</script>那样除以N-1,在numpy里是上述的var。

4. 在matlab中的使用

4.1 matlab 统计基本函数 var方差
参考:(http://blog.csdn.net/tong_huijiao/article/details/54018019

函数名称: var
函数功能:求解方差
函数用法:

  • 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中的第一个维度数相同,即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中观察值发生的次数(或者说概率也行)

1.对于X是向量时:把向量中每个元素看做一个样本
var(X) 或者 var(x,0)函数输出这个向量中元素的样本方差的无偏估计值,var(x,1)输出的是样本方差 。

2. 对于X是矩阵时
把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差

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中对应观察值发生的次数(或者说概率也行)处理

4.2 MATLAB中cov函数的用法
参考:(http://blog.sina.com.cn/s/blog_9e67285801010twv.html)
函数名称:cov
函数功能:求协方差矩阵
函数用法:

  • cov(X) :cov(X,0) = cov(X)
  • cov(X,Y) :X,Y必须是各维数都相同的矩阵
  • cov(X,1) :除以N而不是N-1
  • cov(X,Y,1) : 除以N而不是N-1

1.如果X是向量
cov(X)输出的是这个向量的方差

2. X是一个矩阵来
matlab把每行看做一个观察值,把每列当做一个变量.也就是说对于一个4*3的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个3*3的协方差矩阵。其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的协方差无偏估计值(即除的是N-1)

3.对于cov(X,Y)
X、Y必须是各维数都相等的矩阵,其功能是把X中所有元素看做一个变量的样本,Y中所有元素看做另外一个变量的样本,把矩阵中每个对应位置看做一个联合观察值,函数实现的是求出两个变量的协方差矩阵。

4. cov(X,1) 和 cov(X,Y,1)
与之前的求解过程一致。不同的是,其求出的是协方差,而不是样本的协方差无偏估计值,即其除以的是N 而不是N-1。

先到这里。。。

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值