楼主: 姚喜龙
1368 0

[其他] MATLAB中主成分分析(PCA)与相关性分析的实现 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-11-12
最后登录
2018-11-12

楼主
姚喜龙 发表于 2025-12-9 15:54:16 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、相关性分析方法

1. 基本Pearson相关系数的计算

加载数据,假设变量以列的形式存储在矩阵X中:

X = load('data.mat');  % 请替换为实际的数据文件路径

使用内置函数计算变量间的Pearson相关系数矩阵:

corr_matrix = corr(X);

同时进行显著性检验,获取对应的p值矩阵:

[p_values, ~] = corr(X, 'type', 'pearson', 'rows', 'complete');

通过热力图对相关性结果进行可视化展示:

figure;
heatmap(corr_matrix, 'XData', X.Properties.VariableNames, ...
       'YData', X.Properties.VariableNames, ...
       'ColorMap', parula);
title('Pearson相关系数热力图');
xlabel('变量X');
ylabel('变量Y');
corr()
  • 若需计算Spearman或Kendall相关系数,需在调用时明确指定相应参数。
  • 生成的p值矩阵用于判断相关性的统计显著性,通常以p < 0.05作为显著相关的标准。
'type'
p_values

2. 多变量相关性分析(支持缺失值处理)

读取包含缺失值的实际数据表:

data = readtable('data_with_nan.xlsx');

在计算相关性时自动剔除含有缺失值的观测行:

[corr_matrix, p_values] = corr(data, 'rows', 'complete');

筛选出具有高度显著性的相关关系(设定p < 0.01):

significant_corr = corr_matrix(p_values < 0.01);
disp('显著相关系数矩阵:');
disp(significant_corr);

二、主成分分析(PCA)实现方案

1. 基础PCA流程(含数据标准化步骤)

导入原始数据并执行标准化处理,消除不同变量间量纲差异的影响:

X = load('data.mat');
X_standardized = zscore(X);  % 转换为均值为0、标准差为1的标准形式

应用PCA方法提取主成分:

[coeff, score, latent, tsquared, explained] = pca(X_standardized);

输出关键结果:主成分载荷矩阵及各成分对方差的解释比例:

disp('主成分载荷矩阵:');
disp(coeff);
disp('各主成分解释方差比例:');
disp(explained);

绘制碎石图辅助确定保留的主成分数量:

figure;
pareto(explained / sum(explained) * 100);
xlabel('主成分序号');
ylabel('累计方差贡献率 (%)');
title('碎石图');
zscore()
  • zscore函数确保所有变量处于同一数量级,避免高幅值变量主导分析结果。
  • explained向量反映每个主成分所解释的方差占比,通常当累计贡献率达到85%以上时可停止降维。
explained

2. 主成分得分及其可视化展示

提取前两个主成分的得分用于后续分析:

score_top2 = score(:, 1:2);

绘制样本在主成分空间中的分布散点图:

figure;
gscatter(score_top2(:,1), score_top2(:,2));
xlabel('第一主成分');
ylabel('第二主成分');
title('主成分得分分布');

叠加原始变量的方向向量(基于载荷向量),增强图表解释性:

hold on;
quiver(mean(score_top2(:,1)), mean(score_top2(:,2)), ...
       mean(coeff(:,1)*10), mean(coeff(:,2)*10), 'r', 'LineWidth', 2);
legend('样本点', '变量方向');
hold off;

3. 基于协方差矩阵的手动PCA实现

首先计算标准化后数据的协方差矩阵:

cov_matrix = cov(X_standardized);

对其进行特征值分解,并按降序排列特征向量:

[eigenvectors, eigenvalues] = eig(cov_matrix);
[~, idx] = sort(diag(eigenvalues), 'descend');
eigenvectors = eigenvectors(:, idx);

将原始数据投影到主成分空间:

projected_data = X_standardized * eigenvectors;

提取前两个主成分的结果:

PC1 = projected_data(:, 1);
PC2 = projected_data(:, 2);

三、综合应用实例

1. 数据预处理与PCA结合使用

加载MATLAB内置示例数据集:

load carsmall;
X = [Horsepower Weight Acceleration MPG];

清除包含缺失值的记录以保证分析完整性:

X = rmmissing(X);
% 数据标准化处理
X_standardized = zscore(X);

% 进行主成分分析(PCA)
[coeff, score, latent] = pca(X_standardized);

% 展示分析结果
disp('主成分载荷:');
disp(coeff);
disp('各主成分的方差解释率(百分比):');
disp(latent / sum(latent) * 100);

2. 主成分重构与残差分析

% 使用前两个主成分进行数据重构
reconstructed_data = score(:, 1:2) * coeff(:, 1:2)';
% 计算原始标准化数据与重构数据之间的残差
residuals = X_standardized - reconstructed_data;
% 绘制残差热力图
figure;
heatmap(residuals, 'XData', X.Properties.VariableNames, ...
    'YData', X.Properties.VariableNames, ...
    'ColorMap', parula);
title('主成分重构残差热力图');
pca()

四、核心函数及其参数说明

函数 功能描述 示例参数
pca
pca(X, 'NumComponents', 3)
corr()
corr 计算变量间的相关系数矩阵,支持Pearson、Spearman和Kendall方法
corr(X, 'type', 'spearman')
zscore
zscore()
zscore(X)
eig 求解矩阵的特征值和对应的特征向量
eig()
pareto
[V,D] = eig(A)
pareto()
pareto(percent_explained)

五、实施PCA时的关键注意事项

数据标准化
由于主成分分析对变量的量纲非常敏感,在执行PCA之前必须对原始数据进行标准化处理。推荐使用z-score标准化方法,使每个变量均值为0、标准差为1。

zscore

缺失值处理
若数据中存在缺失值,可选择剔除含有缺失项的观测样本(行),或在计算相关性时利用有效成对删除策略(如设置'Rows','pairwise'参数)来提升数据利用率。

rmmissing()

'rows', 'pairwise'

主成分数量的选择
应结合碎石图(Scree Plot)或累计方差贡献率判断应保留的主成分个数。通常建议累计解释方差比例达到85%以上,以确保信息损失最小。

结果解读要点
主成分载荷矩阵反映了原始变量与主成分之间的线性关系强度。载荷值的绝对值越大,表示该变量对该主成分的影响越显著。

coeff

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB 相关性分析 主成分分析 atlab matla
相关提问:Matlab实现

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-20 07:06