Python【相关矩阵】和【协方差矩阵】

本文介绍如何使用Python的pandas和numpy库计算数据集的相关系数矩阵和协方差矩阵,并通过matplotlib和seaborn进行可视化展示。此外,还介绍了相关系数与协方差的数学定义,并指出在Excel中也可以利用CORREL函数来计算相关系数。

相关系数矩阵

  • pandas.DataFrame(数据).corr()
import pandas as pd
df = pd.DataFrame({
    'a': [11, 22, 33, 44, 55, 66, 77, 88, 99],
    'b': [10, 24, 30, 48, 50, 72, 70, 96, 90],
    'c': [91, 79, 72, 58, 53, 47, 34, 16, 10],
    'd': [99, 10, 98, 10, 17, 10, 77, 89, 10]})
df_corr = df.corr()
# 可视化
import matplotlib.pyplot as mp, seaborn
seaborn.heatmap(df_corr, center=0, annot=True, cmap='YlGnBu')
mp.show()

协方差矩阵

  • numpy.cov(数据)
import numpy as np
matric = [
    [11, 22, 33, 44, 55, 66, 77, 88, 99],
    [10, 24, 30, 48, 50, 72, 70, 96, 90],
    [91, 79, 72, 58, 53, 47, 34, 16, 10],
    [55, 20, 98, 19, 17, 10, 77, 89, 14]]
covariance_matrix = np.cov(matric)
# 可视化
print(covariance_matrix)
import matplotlib.pyplot as mp, seaborn
seaborn.heatmap(covariance_matrix, center=0, annot=True, xticklabels=list('abcd'), yticklabels=list('ABCD'))
mp.show()

补充

协方差

C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] = E [ X Y ] − 2 E [ Y ] [ X ] + E [ X ] [ Y ] = E [ X Y ] − E [ X ] [ Y ] Cov(X,Y) = E[(X-E[X])(Y-E[Y])] \newline = E[XY] - 2E[Y][X] + E[X][Y] \\ = E[XY] - E[X][Y] Cov(X,Y)=E[(XE[X])(YE[Y])]=E[XY]2E[Y][X]+E[X][Y]=E[XY]E[X][Y]

相关系数

r ( X , Y ) = C o v ( X , Y ) V a r [ X ] V a r [ Y ] r(X,Y) = \frac{Cov(X,Y)}{\sqrt{Var[X]Var[Y]}} r(X,Y)=Var[X]Var[Y] Cov(X,Y)

EXCEL也能做

CORREL函数

<think>根据用户当前查询引用内容,用户需要知道如何使用Python求解矩阵协方差矩阵。引用[1][2]强调了协方差矩阵的本质是计算不同维度之间的协方差,而不是不同样本之间。引用[3]则区分了估计协方差矩阵与指定协方差矩阵的不同,但用户当前需求显然是计算给定数据的协方差矩阵。 用户的问题明确要求“求解矩阵协方差矩阵”,即给定一个数据矩阵(每行代表一个样本,每列代表一个属性),需要计算其协方差矩阵。下面将分步骤说明: ### 核心概念 1. **数据矩阵结构**:假设有$m$个样本,每个样本有$n$个属性,则数据矩阵$X$为$m\times n$矩阵。 2. **协方差矩阵计算**:协方差矩阵$\Sigma$是$n\times n$方阵,其第$i$行第$j$列元素为第$i$个属性第$j$个属性的协方差: $$\Sigma_{ij} = \frac{1}{m-1}\sum_{k=1}^m (x_{ki}-\bar{x}_i)(x_{kj}-\bar{x}_j)$$ 其中$x_{ki}$是第$k$个样本的第$i$个属性值,$\bar{x}_i$是第$i$个属性的均值。 ### Python实现方法 #### 方法1:使用NumPy NumPy提供`np.cov()`函数直接计算协方差矩阵。注意该函数默认每行代表一个属性(即每列是一个样本),但通常我们的数据矩阵是每行一个样本,因此需要转置输入矩阵。 ```python import numpy as np # 示例数据:3个样本,每个样本2个属性(2维) data = np.array([[1, 2], [3, 4], [5, 6]]) # 计算协方差矩阵(注意:需要转置数据,使每列代表一个属性) cov_matrix = np.cov(data, rowvar=False) # rowvar=False表示每列是一个属性 print(cov_matrix) ``` **参数说明**: - `rowvar`:默认为`True`表示每行代表一个属性(此时每列是一个样本)。若数据矩阵是每行一个样本、每列一个属性,则需设置`rowvar=False`。 #### 方法2:手动计算(理解原理) ```python import numpy as np def manual_cov(X): # X: m个样本×n个属性的矩阵 m, n = X.shape # 对每个属性求均值 mean_vec = np.mean(X, axis=0, keepdims=True) # 形状(1, n) # 中心化数据:每个属性减去其均值 X_centered = X - mean_vec # 广播机制 # 协方差矩阵 = (中心化数据)^T × 中心化数据 / (m-1) cov_matrix = (X_centered.T @ X_centered) / (m - 1) return cov_matrix # 测试相同数据 data = np.array([[1, 2], [3, 4], [5, 6]]) print(manual_cov(data)) ``` ### 解释输出 对于示例数据`[[1,2],[3,4],[5,6]]`,两个属性(列)的协方差计算如下: - 属性1:[1,3,5],均值3 - 属性2:[2,4,6],均值4 - 协方差 = $[(1-3)(2-4) + (3-3)(4-4) + (5-3)(6-4)] / (3-1) = [4 + 0 + 4]/2 = 4$ - 对角线为方差:属性1的方差 = $[(1-3)^2 + (3-3)^2 + (5-3)^2]/(3-1)=8/2=4$,同理属性2的方差也是4。 因此输出矩阵为: $$ \begin{bmatrix} 4 & 4 \\ 4 & 4 \end{bmatrix} $$ ### 注意事项 1. **分母选择**:样本协方差矩阵分母为$m-1$(无偏估计),若需总体协方差则分母用$m$,可通过`np.cov(..., bias=True)`设置。 2. **数据标准化**:若需相关系数矩阵,可先将数据标准化(每个属性除以其标准差)。 ### 总结 使用NumPy的`np.cov(data, rowvar=False)`是最简便高效的方法,特别适合大规模数据。手动实现有助于理解协方差矩阵的数学本质[^1][^2]。 §§相关问题§§ 1. 如何用Python计算相关系数矩阵? 2. 协方差矩阵为什么是半正定的? 3. 在机器学习中,协方差矩阵有哪些应用场景? </think>### Python求解矩阵协方差矩阵的方法 协方差矩阵是描述多维数据集中各维度之间线性关系的核心工具。其数学定义为: $$ \Sigma = \begin{bmatrix} \sigma_{11} & \cdots & \sigma_{1n} \\ \vdots & \ddots & \vdots \\ \sigma_{n1} & \cdots & \sigma_{nn} \end{bmatrix} $$ 其中 $\sigma_{ij} = \frac{1}{N-1}\sum_{k=1}^N (x_{ki}-\bar{x}_i)(x_{kj}-\bar{x}_j)$ 表示维度 $i$ $j$ 的协方差[^1]。以下是Python实现方法: --- #### 方法1:使用NumPy库(推荐) ```python import numpy as np # 创建样本矩阵(每行一个样本,每列一个属性) data = np.array([ [2.5, 3.0, 1.8], [3.5, 4.2, 2.1], [1.8, 2.0, 1.5] ]) # 计算协方差矩阵(关键参数:rowvar=False 表示每列是一个属性) cov_matrix = np.cov(data, rowvar=False) print("协方差矩阵:\n", cov_matrix) ``` **输出示例**: ``` 协方差矩阵: [[ 0.90333333 1.07 0.615 ] [ 1.07 1.38666667 0.76 ] [ 0.615 0.76 0.43 ]] ``` **关键参数说明**: - `rowvar=False`:确保矩阵的**每列代表一个属性**(维度),这是正确计算的前提[^1][^2] - `bias=False`(默认):使用无偏估计(分母$N-1$),设为`True`则分母为$N$ --- #### 方法2:手动计算(理解原理) ```python def manual_cov(X): """ X: m×n矩阵,m个样本,n个属性 """ # 中心化数据 mean_vec = np.mean(X, axis=0) X_centered = X - mean_vec # 计算协方差矩阵 m = X.shape[0] # 样本数 return (X_centered.T @ X_centered) / (m - 1) # 验证与np.cov结果一致 print("手动计算结果:\n", manual_cov(data)) ``` --- ### 关键注意事项 1. **数据矩阵结构**: - 必须是数值型矩阵 - 每行对应一个样本,每列对应一个属性维度[^1][^2] - 错误结构会导致完全错误的结果 2. **协方差矩阵特性**: - **对称性**:$\sigma_{ij} = \sigma_{ji}$ - **对角线**:$\sigma_{ii}$ 是第$i$维的方差 - **半正定性**:所有特征值 $\geq 0$[^2] 3. **应用场景**: - 主成分分析(PCA)的特征提取 - 多元高斯分布的参数估计 - 投资组合风险分析 > 示例中数据矩阵结构:3个样本(行),每个样本3个属性(列)。协方差矩阵规模始终为 $n \times n$($n$为属性数量)[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值