You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于p值的相关矩阵掩蔽:如何过滤对角线自相关项

优化相关矩阵可视化:过滤显著相关且隐藏自相关对角线项

基于Stack Overflow的一篇回答,我编写了以下代码,用于绘制仅展示p<0.05的显著相关系数的热力图:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 模拟3个相关变量
num_samples = 100
mu = np.array([5.0, 0.0, 10.0])
# 设定协方差矩阵
r = np.array([
        [  3.40, -2.75, -2.00],
        [ -2.75,  5.50,  1.50],
        [ -2.00,  1.50,  1.25]
    ])
y = np.random.multivariate_normal(mu, r, size=num_samples)
df = pd.DataFrame(y)
df.columns = ["Correlated1","Correlated2","Correlated3"]

# 添加两个随机无关变量
for i in range(2):
    df.loc[:,f"Uncorrelated{i}"] = np.random.randint(-2000,2000,len(df))

def corr_sig(df=None):
    p_matrix = np.zeros(shape=(df.shape[1],df.shape[1]))
    for col in df.columns:
        for col2 in df.drop(col,axis=1).columns:
            _ , p = stats.pearsonr(df[col],df[col2])
            p_matrix[df.columns.to_list().index(col),df.columns.to_list().index(col2)] = p
    return p_matrix

def plot_cor_matrix(corr, mask=None):
    f, ax = plt.subplots(figsize=(11, 9))
    sns.heatmap(corr, ax=ax,
                mask=mask,
                # 可视化样式设置
                annot=True, 
                cmap='coolwarm')

# 绘制带显著性过滤的相关矩阵
corr = df.corr()                            # 计算相关系数矩阵
p_values = corr_sig(df)                     # 计算每个相关系数对应的p值
mask = np.invert(np.tril(p_values<0.05))    # 生成掩码:仅保留左下三角的显著相关项
plot_cor_matrix(corr,mask)  

相关矩阵可视化结果

现在需要进一步优化:如何同时过滤掉特征自对比的对角线相关值(即相关系数为1的项)?


解决方案:合并对角线掩码与显著性掩码

只需在生成掩码时,额外添加一个对角线的布尔掩码,将其与原有显著性掩码合并即可:

  1. 创建对角线掩码:生成和相关矩阵维度一致的单位矩阵,转成布尔类型后,对角线元素为True(代表需要隐藏这些位置)。
  2. 合并掩码:用逻辑或(|)将对角线掩码和原有掩码结合,这样既隐藏非显著相关项,也隐藏对角线的自相关项。

修改后的代码片段如下:

# 绘制带显著性过滤+隐藏对角线的相关矩阵
corr = df.corr()                            # 计算相关系数矩阵
p_values = corr_sig(df)                     # 计算每个相关系数对应的p值
# 生成对角线掩码(隐藏自相关的对角线项)
diag_mask = np.eye(corr.shape[0], dtype=bool)
# 合并掩码:隐藏非显著相关项 + 隐藏对角线自相关项
mask = np.invert(np.tril(p_values<0.05)) | diag_mask
plot_cor_matrix(corr,mask)  

这样生成的热力图会同时满足两个要求:只展示左下三角中p<0.05的显著相关系数,并且隐藏所有对角线的自相关项(相关系数为1的单元格)。


内容的提问来源于Stack Exchange,提问作者Gareth Walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:53:26