【无监督学习】主成分分析步骤及matlab实现
主成分分析
- 主成分分析
- 1.算法步骤
- 2.MATLAB 实现
- 参考资料
主成分分析
主成分分析(Principal Component Analysis, PCA)是一种统计方法和技术,用于探索数据的内在结构,主要用于降维和特征提取。PCA通过线性变换将原始数据转换为一组新的、正交的变量——主成分,这些主成分按照所解释方差的大小排序,即第一个主成分解释了数据中最大的方差,第二个主成分解释了剩余方差中的最大部分,以此类推。PCA的主要目的:
- 降维:减少数据集的维度,同时尽可能保留原始数据的重要信息。这对于处理高维数据特别有用,可以简化模型训练过程,降低计算成本,并可能提高模型性能;
- 去噪:通过忽略那些只解释少量方差的主成分,从而去除数据中的噪声;
- 可视化:将高维数据投影到低维空间(通常是2D或3D),便于可视化分析,帮助理解数据分布及模式。
以下是PCA在商业分析中的一些典型使用场景:
- 客户细分与市场篮子分析
- 用途:通过PCA可以将大量客户特征(如购买行为、人口统计信息等)简化为少数几个主成分,这些主成分能够代表原始特征的主要变异情况;
- 好处:有助于识别不同客户群体,优化营销策略,并针对特定客户群体制定个性化的促销活动。
- 财务报表分析
- 用途:利用PCA对财务比率或指标进行降维处理,以识别影响公司业绩的关键因素;
- 好处:帮助投资者和分析师更清晰地理解复杂的财务状况,快速定位到对公司表现有重大影响的因素。
- 风险管理
- 用途:应用于信用评分模型中,用于评估借款人的违约风险;或者在投资组合管理中,通过PCA来识别并量化市场风险因素;
- 好处:提高风险评估的准确性,优化资本配置,降低潜在损失。
- 市场调研与消费者偏好分析
- 用途:当面对大量的消费者调查数据时,PCA可以帮助提取最重要的变量或趋势,了解消费者的偏好和态度;
- 好处:为企业提供洞察力,指导产品开发和服务改进方向,增强竞争力。
- 绩效评估
- 用途:在人力资源领域,PCA可用于员工绩效评估,通过对多个绩效指标的数据降维,找到关键的绩效驱动因素;
- 好处:简化评价体系,使管理者更容易理解和应用,促进公平公正的人才选拔和发展机制。
1.算法步骤
-
数据准备
- 数据收集:获取原始数据矩阵 X \mathbf{X} X(m×n,m为样本数,n为特征数);
- 数据清洗:处理缺失值、异常值(如删除或插值)。
-
数据标准化
- 中心化:对每个特征减去均值,使数据均值为 0: X c e n t e r e d = X − m e a n ( X ) \mathbf{X}_{centered}=\mathbf{X}−mean(\mathbf{X}) Xcentered=X−mean(X)
- 缩放至单位方差(可选):对每个特征除以标准差,消除量纲影响: X s c a l e d = X c e n t e r e d s t d ( X ) \mathbf{X}_{scaled}=\frac{\mathbf{X}_{centered}}{std(\mathbf{X})} Xscaled=std(X)Xcentered
-
计算协方差矩阵
- 协方差矩阵反映特征间的线性相关性: C = 1 m − 1 X c e n t e r e d T X c e n t e r e d \mathbf{C}=\frac{1}{m−1}\mathbf{X}_{centered}^T\mathbf{X}_{centered} C=m−11XcenteredTXcentered
-
特征值分解
- 对协方差矩阵 C \mathbf{C} C 进行特征分解: C = V Λ V T \mathbf{C}=\mathbf{V} \mathbf{Λ} \mathbf{V}^T C=VΛVT
- Λ \mathbf{Λ} Λ:对角矩阵,包含特征值 λ 1 ≥ λ 2 ≥ ⋯ ≥ λ n λ_1≥λ_2≥⋯≥λ_n λ1≥λ2≥⋯≥λn;
- V \mathbf{V} V:正交矩阵,列向量为对应的特征向量(主成分方向)。
-
选择主成分
- 方差贡献率:每个主成分解释的方差比例: 贡献 率 i = λ i ∑ j = 1 n λ j 贡献率_i=\frac{λ_i}{\sum_{j=1}^{n}λ_j} 贡献率i=∑j=1nλjλi
- 累积方差贡献率:前 k 个主成分的累积解释方差比例: 累积贡献率 = ∑ i = 1 k 贡献 率 i 累积贡献率=\sum_{i=1}^{k}贡献率_i 累积贡献率=i=1∑k贡献率i
- 选择标准:通常选择 累积贡献率 ≥ 85 % 累积贡献率 ≥ 85\% 累积贡献率≥85% 或 保留特征值 > 1 保留特征值 >1 保留特征值>1 的主成分。
-
数据降维
- 将原始数据投影到选定的主成分上:
Z
=
X
c
e
n
t
e
r
e
d
V
k
\mathbf{Z}=\mathbf{X}_{centered}\mathbf{V} _k
Z=XcenteredVk
- V k \mathbf{V} _k Vk :前 k 个特征向量组成的矩阵;
- Z \mathbf{Z} Z :降维后的数据(m×k)。
2.MATLAB 实现
%% PCA降维案例:电商用户行为分析
% 功能: 使用PCA对用户行为数据进行降维
clc; clear; close all;
%% 1. 生成模拟数据
rng(0); % 固定随机种子
m = 100; % 样本数量
% 生成特征数据
visit_freq = 5 + 3*randn(m,1); % 正态分布,均值5
cart_add = poissrnd(4, m,1); % 泊松分布,均值4
time_spent = 120 + 50*randn(m,1); % 正态分布,均值120秒
purchase_amount = 500 + 200*randn(m,1); % 正态分布,均值500元
% 合并数据矩阵
X = [visit_freq, cart_add, time_spent, purchase_amount];
%% 2. 数据标准化(中心化 + 单位方差)
X_centered = X - mean(X); % 中心化
X_scaled = X_centered ./ std(X); % 标准化(Z-score)
%% 3. 主成分分析(PCA)
[coeff, score, latent, ~, explained] = pca(X_scaled);
%% 4. 主成分选择
% 计算累积方差贡献率
cumulative_variance = cumsum(explained);
% 显示方差贡献率
disp('各主成分方差贡献率 (%):');
disp(explained');
disp('累积方差贡献率 (%):');
disp(cumulative_variance');
% 选择累积贡献率 ≥85%的主成分
k = find(cumulative_variance >= 85, 1, 'first');
fprintf('\n选择前 %d 个主成分(累积贡献率=%.1f%%)\n', k, cumulative_variance(k));
%% 5. 降维后的数据
Z = score(:,1:k); % 降维后的数据
%% 6. 结果可视化
figure;
% 主成分散点图(前两个主成分)
subplot(1,2,1);
scatter(score(:,1), score(:,2), 'filled');
xlabel('PC1');
ylabel('PC2');
title('前两个主成分散点图');
grid on;
% 方差贡献率累积图
subplot(1,2,2);
plot(cumulative_variance, 'ro-', 'LineWidth', 2);
hold on;
plot([1,4], [85,85], 'k--');
xlabel('主成分数量');
ylabel('累积方差贡献率 (%)');
title('方差贡献率累积曲线');
xticks(1:4);
grid on;
%% 7. 主成分解释
% 显示主成分系数(特征向量)
disp('主成分系数矩阵(特征向量):');
disp(coeff(:,1:k));
参考资料
[1] 用最直观的方式告诉你:什么是主成分分析PCA_哔哩哔哩_bilibili
[2] 2-6-主成分分析简单案例_哔哩哔哩_bilibili