给我一个直观的例子说明相关系数矩阵的用法
Tạo vào: 10 tháng 12, 2025
Trả lời bằng GPT-5.1 Thinking bởi Chat01
Tạo vào: 10 tháng 12, 2025
Trả lời bằng GPT-5.1 Thinking bởi Chat01
给我一个直观的例子说明相关系数矩阵的用法
先直接给你一个很有画面感的例子,别的先不说。
你有一批学生数据,记录了三个变量:
你想回答的问题是:
哪些行为跟“成绩”最有关系?我该从哪下手改?
我们算出这三个变量之间的相关系数矩阵(只是举例,数字是合理的假设):
怎么读这个矩阵?
重点看非对角线的数字:
自习时长 vs 成绩:0.85(强正相关)
玩手机时长 vs 成绩:-0.80(强负相关)
自习时长 vs 玩手机:-0.70(中等偏强负相关)
如果你只看单独的散点图,很费劲;
相关系数矩阵帮你 一张表看所有两两关系:
和“成绩”最相关的是谁?
如果有更多变量(比如:睡眠时间、上课出勤率、补习班次数……)
一张相关矩阵就能快速看出:
哪几个变量跟“成绩”关系大,哪些几乎没啥关系(相关系数接近 0)
假设你为了预测成绩,收集了:
算出来的相关矩阵里,发现:
这说明:
合并一下,或者只留一个变量
所以:
相关系数矩阵 = 上模型前的变量关系总览图
简单提一句别的场景,让你更直观:
如果相关矩阵告诉你:
那你就知道:
相关系数矩阵就是一个“所有变量两两关系的地图”:
- 帮你找出 和目标最相关的变量(该从哪入手)
- 帮你发现 高度相似的变量(该删谁、该合并谁)
- 在很多场景(建模、风控、选股、实验设计)里,都是第一眼要看的东西。
如果你愿意,我可以用你感兴趣的领域(比如房价、运动健身、理财、游戏数据等)再给你一个“定制版”的相关矩阵例子。
给我讲讲相关系数矩阵的计算方式,并且给一个python和matlab的例子
相关系数矩阵其实就是:
先按“公式”算出所有变量两两之间的相关系数,再排成一个矩阵。
下面我分三步讲:
假设有两个变量 和 ,各有 个观测值:
它们的皮尔逊相关系数(Pearson correlation)定义为:
其中
是 的样本均值, 是 的样本均值。
现在有 个变量,每个变量有 条记录。
把数据写成一个矩阵 :
记第 列为变量 ,它对应的数据是 。
对每一列减去自己的均值:
样本协方差矩阵 是:
记每个变量的样本标准差为
构造一个对角矩阵 :
相关系数矩阵 的矩阵形式:
也就是:
这和一开始单个相关系数的公式完全一致,只是写成了矩阵版。
这里给一个完整可跑的例子:
pythonimport numpy as np # 假设有 5 个样本,3 个变量: # 变量1:自习时长 # 变量2:考试成绩 # 变量3:玩手机时长 X = np.array([ [2.0, 70.0, 5.0], [3.0, 78.0, 4.0], [4.0, 85.0, 3.0], [5.0, 88.0, 2.0], [6.0, 92.0, 1.0] ]) # np.corrcoef 默认是以行作为变量,所以需要 rowvar=False R = np.corrcoef(X, rowvar=False) print("数据矩阵 X:") print(X) print("\n相关系数矩阵 R:") print(R)
rowvar=False的意思是 “每一列是一个变量”,这正好符合我们平常整理数据的方式。
pythonimport numpy as np X = np.array([ [2.0, 70.0, 5.0], [3.0, 78.0, 4.0], [4.0, 85.0, 3.0], [5.0, 88.0, 2.0], [6.0, 92.0, 1.0] ]) # 1. 每列减去均值(中心化) X_mean = X.mean(axis=0) # shape: (3,) Xc = X - X_mean # shape: (5,3) # 2. 样本协方差矩阵 (n-1 在分母) n = X.shape[0] S = (Xc.T @ Xc) / (n - 1) # shape: (3,3) # 3. 计算标准差(对角线开方) std = np.sqrt(np.diag(S)) # shape: (3,) # 4. 构造相关系数矩阵 R_manual = S / np.outer(std, std) print("协方差矩阵 S:") print(S) print("\n手工计算得到的相关系数矩阵 R_manual:") print(R_manual)
你会发现 R_manual 和前面的 np.corrcoef 结果是一致的(浮点数误差除外)。
pythonimport pandas as pd df = pd.DataFrame( X, columns=["study_hours", "score", "phone_hours"] ) print(df) print("\nPandas 相关系数矩阵:") print(df.corr()) # 默认就是 Pearson 相关系数
MATLAB 里计算相关系数矩阵非常直接,用 corrcoef 就行。
matlab% 假设同样的数据:5个样本,3个变量 X = [ 2.0 70.0 5.0; 3.0 78.0 4.0; 4.0 85.0 3.0; 5.0 88.0 2.0; 6.0 92.0 1.0 ]; R = corrcoef(X); disp('数据矩阵 X:'); disp(X); disp('相关系数矩阵 R:'); disp(R);
R 就是 的相关系数矩阵你也可以在 MATLAB 里自己按公式实现一遍:
matlabX = [ 2.0 70.0 5.0; 3.0 78.0 4.0; 4.0 85.0 3.0; 5.0 88.0 2.0; 6.0 92.0 1.0 ]; [n, p] = size(X); % 1. 每列减去均值(中心化) mu = mean(X, 1); % 1 x p Xc = X - mu; % n x p % 2. 样本协方差矩阵 S = (Xc' * Xc) / (n - 1); % p x p % 3. 标准差 std_vec = sqrt(diag(S)); % p x 1 % 4. 构造相关系数矩阵 R_manual = S ./ (std_vec * std_vec'); % p x p disp('协方差矩阵 S:'); disp(S); disp('手工计算的相关系数矩阵 R\_manual:'); disp(R_manual);
对每对变量 ,用皮尔逊公式算出相关系数 ,再排成矩阵。
先算协方差矩阵 ,再用 得到相关系数矩阵。
Python 用
np.corrcoef/pandas.DataFrame.corr(),MATLAB 用corrcoef,都很方便。
如果你愿意,我可以再帮你写一段从 CSV 读真实数据、画热力图(相关系数矩阵可视化)的 Python 代码,这样“看矩阵”会更直观。