如何计算NumPy矩阵间的Pearson相关系数(单值/相关矩阵)
NumPy同形状矩阵Pearson相关系数计算方案
问题原因
直接调用np.corrcoef无法得到单值相关系数,是因为该函数默认将传入的每一行视为一个独立变量,逐行计算变量间的相关系数:传入两个展平后的一维数组时,函数会返回2×2的相关矩阵,而非单个数值。
基础需求:两个矩阵计算单个相关系数
操作步骤:
- 将两个矩阵统一转为ndarray类型后展平为一维向量
- 调用
np.corrcoef后取结果矩阵的非对角元,即为两个矩阵整体的Pearson相关系数
代码实现:
import numpy as np a = np.matrix('1 2 3; 3 4 5; 1 2 4') b = np.matrix('1 2 3; 4 3 5; 3 4 5') a_flat = np.asarray(a).flatten() b_flat = np.asarray(b).flatten() single_corr = np.corrcoef(a_flat, b_flat)[0, 1] print(single_corr) # 输出结果:0.7228063197118112
进阶需求:多个矩阵计算两两相关系数矩阵
操作步骤:
- 将所有待计算的同形状矩阵逐一转为ndarray、展平为一维向量
- 将所有一维向量按行堆叠为形状为
(矩阵总数, 单矩阵元素个数)的二维数组 - 对该二维数组直接调用
np.corrcoef,输出结果即为所有矩阵两两对应的相关系数矩阵
代码实现:
import numpy as np a = np.matrix('1 2 3; 3 4 5; 1 2 4') b = np.matrix('1 2 3; 4 3 5; 3 4 5') c = np.matrix('1 2 3; 4 3 5; 3 4 5') # 堆叠所有展平后的矩阵向量 stacked_arr = np.vstack([np.asarray(m).flatten() for m in [a, b, c]]) corr_mat = np.corrcoef(stacked_arr) print(corr_mat)
输出结果:
[[1. 0.72280632 0.72280632] [0.72280632 1. 1. ] [0.72280632 1. 1. ]]
你给出的期望输出中a与c的相关系数标注为1属于笔误:示例中c和b完全相同,因此a与c的相关系数和a与b的相关系数一致,均为0.7228。
内容的提问来源于stack exchange,提问作者je2018
相关产品推荐
相关产品推荐

