协方差矩阵的计算及意义

声明:博文转自https://blog.youkuaiyun.com/mr_hhh/article/details/78490576

一、首先看一个比较简洁明了的协方差计算介绍:

1. 协方差定义
X、Y 是两个随机变量,X、Y 的协方差 cov(X, Y) 定义为:

其中,

2. 协方差矩阵定义
矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。

协方差矩阵:

协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / m,而不是 1 / (m - 1).

3. 求解协方差矩阵的步骤
举个例子,矩阵 X 按行排列:


1. 求每个维度的平均值

2. 将 X 的每一列减去平均值

其中:


3. 计算协方差矩阵


--------------------- 
作者:Rise_1024 
来源:优快云 
原文:https://blog.youkuaiyun.com/mr_hhh/article/details/78490576 
版权声明:本文为博主原创文章,转载请附上博文链接!

二、再来看一下协方差矩阵的意义:

协方差代表的意义是什么? 

在概率论中,两个随机变量 X 与 Y 之间相互关系,大致有下列3种情况:

 

 

情况一,如上, 当 X, Y 的联合分布像上图那样时,我们可以看出,大致上有: X 越大  Y 也越大, X 越小  Y 也越小,这种情况,我们称为“正相关”。

 

情况二, 如上图, 当X, Y 的联合分布像上图那样时,我们可以看出,大致上有:X 越大Y 反而越小,X 越小 Y 反而越大,这种情况,我们称为“负相关”。

情况三,如上图, 当X, Y  的联合分布像上图那样时,我们可以看出:既不是X  越大Y 也越大,也不是 X 越大 Y 反而越小,这种情况我们称为“不相关”。

 

 

怎样将这3种相关情况,用一个简单的数字表达出来呢?

在图中的区域(1)中,有 X>EX ,Y-EY>0 ,所以(X-EX)(Y-EY)>0;

在图中的区域(2)中,有 X<EX ,Y-EY>0 ,所以(X-EX)(Y-EY)<0;

在图中的区域(3)中,有 X<EX ,Y-EY<0 ,所以(X-EX)(Y-EY)>0;

在图中的区域(4)中,有 X>EX ,Y-EY<0 ,所以(X-EX)(Y-EY)<0。

当X 正相关时,它们的分布大部分在区域(1)和(3)中,小部分在区域(2)和(4)中,所以平均来说,有E(X-EX)(Y-EY)>0 

当 X与 Y负相关时,它们的分布大部分在区域(2)和(4)中,小部分在区域(1)和(3)中,所以平均来说,有(X-EX)(Y-EY)<0 

当 X与 Y不相关时,它们在区域(1)和(3)中的分布,与在区域(2)和(4)中的分布几乎一样多,所以平均来说,有(X-EX)(Y-EY)=0 

所以,我们可以定义一个表示X, Y 相互关系的数字特征,也就是协方差

cov(X, Y) = E(X-EX)(Y-EY)

当 cov(X, Y)>0时,表明 X正相关

当 cov(X, Y)<0时,表明XY负相关;

当 cov(X, Y)=0时,表明XY不相关。

这就是协方差的意义。

 

三、此部分进行更系统的说明:

声明:博文转自 https://blog.youkuaiyun.com/ybdesire/article/details/6270328

协方差的定义

对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这个公式来计算,还真不容易反应过来。网上值得参考的资料也不多,这里用一个例子说明协方差矩阵是怎么计算出来的吧。

记住,X、Y是一个列向量,它表示了每种情况下每个样本可能出现的数。比如给定

则X表示x轴可能出现的数,Y表示y轴可能出现的。注意这里是关键,给定了4个样本,每个样本都是二维的,所以只可能有X和Y两种维度。所以

用中文来描述,就是:

协方差(i,j)=(第i列的所有元素-第i列的均值)*(第j列的所有元素-第j列的均值)

这里只有X,Y两列,所以得到的协方差矩阵是2x2的矩阵,下面分别求出每一个元素:

        

所以,按照定义,给定的4个二维样本的协方差矩阵为:

用matlab计算这个例子

z=[1,2;3,6;4,2;5,2]

cov(z)

ans =

    2.9167   -0.3333

   -0.3333    4.0000

可以看出,matlab计算协方差过程中还将元素统一缩小了3倍。所以,协方差的matlab计算公式为:

    协方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1)

       下面在给出一个4维3样本的实例,注意4维样本与符号X,Y就没有关系了,X,Y表示两维的,4维就直接套用计算公式,不用X,Y那么具有迷惑性的表达了。

        

(3)与matlab计算验证

                     Z=[1 2 3 4;3 4 1 2;2 3 1 4]

                     cov(Z)

                     ans =

                          1.0000    1.0000   -1.0000   -1.0000

                          1.0000    1.0000   -1.0000   -1.0000

                         -1.0000   -1.0000    1.3333    0.6667

                          -1.0000   -1.0000    0.6667    1.3333

       可知该计算方法是正确的。我们还可以看出,协方差矩阵都是方阵,它的维度与样本维度有关(相等)。参考2中还给出了计算协方差矩阵的源代码,非常简洁易懂,在此感谢一下!

 

参考:

[1] http://en.wikipedia.org/wiki/Covariance_matrix

[2] http://www.cnblogs.com/cvlabs/archive/2010/05/08/1730319.html
--------------------- 
作者:ybdesire 
来源:优快云 
原文:https://blog.youkuaiyun.com/ybdesire/article/details/6270328 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 使用 Python 和 NumPy 计算协方差矩阵 在 Python 中,可以利用 `NumPy` 库中的 `numpy.cov()` 函数来计算协方差矩阵。该函数会基于输入数据的维度自动调整其行为[^3]。 #### 协方差矩阵的概念 协方差矩阵是一个对称矩阵,用于表示多维随机变量之间的线性关系强度。假设有一个大小为 `(n_samples, n_features)` 的二维数组 `X`,其中每一列表示一个特征向量,则协方差矩阵可以通过以下方式计算: 1. **标准化数据**:通常需要先减去每列的均值。 2. **应用公式**:通过特定方法(如外积法或内置函数)构建协方差矩阵。 --- #### 方法一:使用 `numpy.cov()` 以下是使用 `numpy.cov()` 来计算协方差矩阵的代码示例: ```python import numpy as np # 创建一个 (5, 9) 形状的随机数数组作为样本数据 data = np.random.rand(5, 9) # 调整数据方向以匹配 numpy.cov 默认的行为 # 如果希望得到 NxN 矩阵而不是 FxF 矩阵,需指定 rowvar=False 参数 cov_matrix = np.cov(data, rowvar=False) print("Using numpy.cov():") print(cov_matrix) ``` 默认情况下,`rowvar=True` 表明每一行代表一个变量;而当设置 `rowvar=False` 时,每一列被视作一个变量[^4]。因此,在处理形状为 `(5, 9)` 的数据集时,应显式传递参数 `rowvar=False` 才能获得期望的 5×5 协方差矩阵。 --- #### 方法二:手动实现协方差矩阵 除了调用现成库之外,还可以借助矩阵运算自行构造协方差矩阵。具体过程如下所示: ```python def manual_covariance(matrix): """ Manually compute the covariance matrix of a given data set. Parameters: matrix (ndarray): Input array with shape (n_samples, n_features). Returns: ndarray: Covariance matrix of size (n_features, n_features). """ # Step 1: Subtract mean from each column centered_data = matrix - np.mean(matrix, axis=0) # Step 2: Compute dot product and normalize by number of samples minus one cov_mat = np.dot(centered_data.T, centered_data) / (matrix.shape[0] - 1) return cov_mat manual_result = manual_covariance(data) print("\nManually computed:") print(manual_result) ``` 此方法严格按照定义执行中心化和缩放操作,并最终形成目标矩阵[^2]。 --- #### 结果对比分析 上述两种途径均可得出有效的协方差估计值。然而需要注意的是,默认配置下 `np.cov()` 倾向于沿第一个轴迭代(即将各列为独立观测),所以如果不加以干预可能会导致混淆实际意图的结果尺寸偏差问题。另外值得注意的一点在于数值精度方面可能存在细微差别,但这并不影响整体解释意义[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值