python协方差矩阵_协方差矩阵的python实现

本文介绍了协方差的概念,以及如何使用Python计算协方差矩阵。通过实例展示了使用Matlab和Numpy进行协方差计算的过程,强调了协方差矩阵计算不同维度之间的协方差,并给出了Matlab和Numpy的代码示例。

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

学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。

为什么需要协方差?

上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

来度量各个维度偏离其均值的程度,标准差可以这么来定义:

协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,嘿嘿,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?如果为0,也是就是统计上说的“相互独立”。

从协方差的定义上我们也可以看出一些显而易见的性质,如:

协方差多了就是协方差矩阵

上一节提到的猥琐和受欢迎的问题是典型二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算 n! / ((n-2)!*2) 个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:

这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

Matlab协方差实战

上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。这个我将结合下面的例子说明,以下的演示将使用M

### 使用 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、付费专栏及课程。

余额充值