当前位置: 首页 > article >正文

【无监督学习】主成分分析步骤及matlab实现

主成分分析

    • 主成分分析
      • 1.算法步骤
      • 2.MATLAB 实现
      • 参考资料

主成分分析

主成分分析(Principal Component Analysis, PCA)是一种统计方法和技术,用于探索数据的内在结构,主要用于降维和特征提取。PCA通过线性变换将原始数据转换为一组新的、正交的变量——主成分,这些主成分按照所解释方差的大小排序,即第一个主成分解释了数据中最大的方差,第二个主成分解释了剩余方差中的最大部分,以此类推。PCA的主要目的:

  • 降维:减少数据集的维度,同时尽可能保留原始数据的重要信息。这对于处理高维数据特别有用,可以简化模型训练过程,降低计算成本,并可能提高模型性能;
  • 去噪:通过忽略那些只解释少量方差的主成分,从而去除数据中的噪声;
  • 可视化:将高维数据投影到低维空间(通常是2D或3D),便于可视化分析,帮助理解数据分布及模式。

以下是PCA在商业分析中的一些典型使用场景:

  • 客户细分与市场篮子分析
    • 用途:通过PCA可以将大量客户特征(如购买行为、人口统计信息等)简化为少数几个主成分,这些主成分能够代表原始特征的主要变异情况;
    • 好处:有助于识别不同客户群体,优化营销策略,并针对特定客户群体制定个性化的促销活动。
  • 财务报表分析
    • 用途:利用PCA对财务比率或指标进行降维处理,以识别影响公司业绩的关键因素;
    • 好处:帮助投资者和分析师更清晰地理解复杂的财务状况,快速定位到对公司表现有重大影响的因素。
  • 风险管理
    • 用途:应用于信用评分模型中,用于评估借款人的违约风险;或者在投资组合管理中,通过PCA来识别并量化市场风险因素;
    • 好处:提高风险评估的准确性,优化资本配置,降低潜在损失。
  • 市场调研与消费者偏好分析
    • 用途:当面对大量的消费者调查数据时,PCA可以帮助提取最重要的变量或趋势,了解消费者的偏好和态度;
    • 好处:为企业提供洞察力,指导产品开发和服务改进方向,增强竞争力。
  • 绩效评估
    • 用途:在人力资源领域,PCA可用于员工绩效评估,通过对多个绩效指标的数据降维,找到关键的绩效驱动因素;
    • 好处:简化评价体系,使管理者更容易理解和应用,促进公平公正的人才选拔和发展机制。

1.算法步骤

数据准备
标准化
特征值分解
主成分选择
数据清洗
数据收集
缩放至单位方差
中心化
排序特征值及特征向量
计算特征值
选择累积贡献率达标的主成分
计算方差贡献率
数据准备
数据标准化
计算协方差矩阵
特征值分解
选择主成分
数据降维
  1. 数据准备

    • 数据收集:获取原始数据矩阵 X \mathbf{X} X(m×n,m为样本数,n为特征数);
    • 数据清洗:处理缺失值、异常值(如删除或插值)。
  2. 数据标准化

    • 中心化:对每个特征减去均值,使数据均值为 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=Xmean(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
  3. 计算协方差矩阵

    • 协方差矩阵反映特征间的线性相关性: 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=m11XcenteredTXcentered
  4. 特征值分解

    • 对协方差矩阵 C \mathbf{C} C 进行特征分解: C = V Λ V T \mathbf{C}=\mathbf{V} \mathbf{Λ} \mathbf{V}^T C=VT
    • Λ \mathbf{Λ} Λ:对角矩阵,包含特征值 λ 1 ≥ λ 2 ≥ ⋯ ≥ λ n ​ λ_1≥λ_2≥⋯≥λ_n​ λ1λ2λn
    • V \mathbf{V} V:正交矩阵,列向量为对应的特征向量(主成分方向)。
  5. 选择主成分

    • 方差贡献率:每个主成分解释的方差比例: 贡献 率 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=1k贡献i
    • 选择标准:通常选择 累积贡献率 ≥ 85 % 累积贡献率 ≥ 85\% 累积贡献率85% 保留特征值 > 1 保留特征值 >1 保留特征值>1 的主成分。
  6. 数据降维

  • 将原始数据投影到选定的主成分上: 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


http://www.kler.cn/a/565349.html

相关文章:

  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 4
  • 神经网络 - 激活函数(ReLU 函数)
  • 第12章_管理令牌和会话
  • AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障
  • 提示学习(Prompting)
  • 使用ssh客户端完成Linux远程登录
  • 【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界
  • 网络测试仪在测量传输速率
  • Flutter 学习之旅 之 flutter 使用 webview_flutter 进行网页加载显示
  • 文本数据格式转换备份
  • CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀
  • CSS 媒体查询:从入门到精通,打造跨设备完美体验
  • Python 爬虫实战案例 - 获取社交平台事件热度并进行影响分析
  • WordPress Course Booking System SQL注入漏洞复现 (CVE-2025-22785)(附脚本)
  • DOM Node
  • 51单片机测试题AI作答测试(DeepSeek Kimi)
  • 基于MATLAB的短时傅里叶变换和小波变换及图像处理
  • C++初阶——类与对象(上)
  • 自然语言处理:稀疏向量表示
  • 点云 PCL 滤波在自动驾驶的用途。