ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

主成分分析改进与MATLAB实现:从原理到综合评价完整指南

主成分分析改进与MATLAB实现:从原理到综合评价完整指南 简介针对主成分分析法PCA及其改进策略这份MATLAB程序包提供了完整的自定义实现适合数据分析、挖掘及统计建模方向的学生与工程师使用。包内包含1个MATLAB源文件.m整体压缩后仅1KB属于轻量型算法代码核心覆盖数据标准化、协方差矩阵计算、特征值分解、主成分动态选择等关键环节并带有指标相对贡献值计算功能可帮助理解每个主成分在降维中的实际贡献。资源已吸引510人学习说明其在教学演示和科研参考中有较高价值。通过阅读该程序读者既能掌握PCA的手写实现思路也能在此基础上扩展PLS、主成分回归等改进方法是入门到进阶主成分分析的实用参考。1. 主成分分析法改进与MATLAB实现从指标压缩到综合评价的完整闭环手头攒了20多个指标、每个量纲还不一样直接扔进评价模型结果第一主成分贡献率不到30%——这是我第一次用主成分分析法PCA翻车的现场。后来才明白单纯调用pca()函数只是个开始真正决定结果可用性的是数据预处理、改进方向选择和载荷矩阵的解读方式。这篇文章要讲的就是围绕一份类似zhuchengfen.zip的MATLAB程序包里最常见的那几样东西——主成分分析法、主成分改进、指标主成分——把它们拆开讲透从基础PCA跑通到标准化、核化、鲁棒化、稀疏化四种改进方向再到用主成分做综合评价最后是排错和验证技巧。适合正在做综合评价、指标降维或特征提取的工程师和研究生拿过去就能照着改自己的数据。2. 主成分分析法的原理与pca()函数的最小实现2.1 PCA的数学本质特征值分解到底分解出了什么主成分分析法的核心目标是在保留尽量多原始信息的前提下用少数几个互不相关的综合变量替代原来的多个指标。这句话拆开看有两层含义一是主成分之间不相关避免原指标之间的多重共线性干扰二是信息量用方差来衡量方差大的方向保留的信息多。从数学上看设X是n行m列的数据矩阵n个样本m个指标先做中心化或标准化构造协方差矩阵。协方差矩阵的m个特征向量就是这个数据空间里m个互相正交的方向特征值的大小代表数据沿该方向散布的方差。按特征值从大到小取前k个特征向量组成载荷矩阵原始数据投影到这些方向上得到的就是k个主成分得分。第j个主成分的方差贡献率就是第j个特征值除以所有特征值之和累计贡献率通常达到85%以上就可以认为这k个主成分能代表原始指标的大部分信息。这里有一个必须说清楚的细节直接对原始数据矩阵做特征分解在数值上不如对X做奇异值分解SVD稳定。MATLAB的pca()函数内部用的就是SVD所以在数据量较大或指标间相关性很强的时候用内置函数而不是自己写eig(cov(X))会更稳。手写eig()适合验证算法逻辑落地干活还是以pca()为主。2.2 用pca()跑通最小流程函数输入输出逐项拆解先给一个可以直接复制运行的最小代码块。我用的是模拟数据结构上故意构造了两组强相关指标方便观察主成分的压缩效果。% 模拟数据30个样本6个指标 rng(42); % 固定随机种子便于复现 X randn(30, 6); X(:, 2) 2 * X(:, 1) 0.5 * randn(30, 1); % 指标2与指标1强相关 X(:, 4) -1.5 * X(:, 3) 0.5 * randn(30, 1); % 指标4与指标3强相关 % 标准化pca()默认只中心化不除以标准差 X_std zscore(X); % 主成分分析 [coeff, score, latent, ~, explained] pca(X_std); % 查看贡献率 disp(各主成分方差贡献率(%)); disp(explained); fprintf(前两个主成分累计贡献率%.2f%%\n, sum(explained(1:2))); % 查看前两个主成分的载荷 disp(前两个主成分载荷矩阵(行指标, 列主成分)); disp(coeff(:, 1:2)); % 降维后的得分矩阵 Z score(:, 1:2);pca()函数返回五个输出落地里最常用的是前三个和最后一个。coeff是载荷矩阵每一列对应一个主成分列向量长度归一为1绝对值越大说明该原始指标在这个主成分上的影响越大。score是主成分得分矩阵是标准化后的数据在载荷方向上的投影。latent是特征值数值上等于对应主成分的方差。explained是贡献率单位是百分比它其实就是latent除以latent总和再乘100。注意pca()默认只对数据做中心化不做标准化。指标量纲差异大时不先做zscore会让量级大的指标霸占第一主成分这是主成分分析法里最常见的翻车原因。2.3 指标主成分的提取从载荷读懂每个主成分的业务含义主成分分析最容易被忽略的一步是把数学结果翻译成业务语言。载荷矩阵里每个主成分的系数表示该指标和这个主成分的相关系数方向与强度。比如第一个主成分的载荷向量里指标1系数为0.6、指标2系数为0.55而其余指标接近0那第一主成分基本就是指标1和指标2的综合可以理解为这两个指标背后的公共因子。得分矩阵的每一行对应一个样本每一列是样本在该主成分上的位置正负号只有相对意义。主成分的符号方向本身是不确定的——特征向量乘以-1仍然是特征向量这是PCA的固有性质也是后面第5章要重点说的避坑点。在不同文献或程序中对比载荷时不要因为符号相反就认为结果错了。提取哪几个主成分常用的判断依据有三个特征值大于1、累计贡献率超过85%、碎石图拐点。特征值大于1的准则适合标准化后的数据因为标准化后每个原始指标本身的方差为1特征值小于1说明该主成分解释的信息还不如一个原始指标多。在实际工程里我一般先把explained打印出来看一眼再结合场景决定保留个数不会机械照搬阈值。3. 改进的主成分分析法四种主流改进方向与MATLAB实现3.1 原始PCA的三个典型翻车场景原始PCA在干净的低维数据上表现稳定但现实里的指标数据通常带着三类问题也正是这三类问题催生了各种改进思路。第一是量纲差异。指标单位不同、数量级不同如果不做标准化方差大的指标在协方差矩阵里天然占主导地位。很多人以为调用了zscore就万事大吉实际还要确认数据是否包含异常值——zscore对异常值非常敏感一个离群点会把均值和标准差都拉偏标准化后的数据仍然带伤。第二是非线性结构。PCA是线性方法它只能找到数据在该线性方向上最大方差的方向。如果数据结构本身是曲线或者流形比如圆形分布、螺旋结构线性PCA压缩后的低维表示会丢失大量结构信息这时候需要核主成分分析KPCA。第三是异常值干扰。PCA的目标是最大方差一个异常点本身方差就大PCA会优先去拟合这个点而不是整体结构导致前几个主成分方向被异常值带跑。典型表现是第一主成分的方向指向异常点所在的方向且贡献率异常高。处理思路是先检测异常值再做降维。3.2 改进方向一基于相关系数矩阵的标准化PCA——综合评价的默认配置针对量纲和异常值问题最常见也是工程里最容易落地的改进就是基于相关系数矩阵的PCA。前面的zscore加pca()组合本质上已经是在做这件事标准化后协方差矩阵就是相关系数矩阵。但这里的细节在于什么时候用相关系数矩阵、什么时候用协方差矩阵是有讲究的。相关系数矩阵对每个指标等权对待适合没有先验权重、想做综合评价的场景。协方差矩阵保留了原始方差信息适合指标本身是同一物理量、量纲一致且方差大小本身有业务含义的场景。做指标主成分综合评价我几乎总是选相关系数矩阵路线因为评价模型要求指标之间公平谁也不能因为单位大就欺负别人。代码层面标准的做法是% 假设data是n行m列的原始指标矩阵第一列是编号第二列起是指标 % data [ID, 指标1, 指标2, ..., 指标m]; X_raw data(:, 2:end); % 1. 用箱形图检测异常值对应常见的根据箱形图检测异常值的matlab程序 % 这里先给出检测逻辑不直接删除先看分布 figure; boxplot(X_raw, Labels, strcat(V, num2str((1:size(X_raw,2))))); title(指标箱形图——先看异常值分布); % 2. 标准化 X_std zscore(X_raw); % 3. 基于相关系数矩阵做PCAzscore后pca默认就是用相关系数矩阵 [coeff, score, latent, ~, explained] pca(X_std); % 4. 输出累计贡献率判断保留的主成分数量 cumsum(explained)这段代码把异常值检测放在了PCA之前。boxplot画箱形图是一种直观的检测方式箱体外的点视为疑似异常值。值得注意的是检测出来不代表一定要删除——如果异常值来自真实的业务状态比如某个行业有特殊的经营模式直接删除反而会损失信息。我通常的处理方式是先标记异常值跑一次PCA对比删除前后的贡献率和载荷变化如果变化不大就不动如果第一主成分贡献率因为一两个点从60%掉到30%那必须处理。3.3 改进方向二核主成分分析KPCA——处理非线性结构当指标之间呈明显非线性关系时可以用核主成分分析。KPCA的思路是用一个核函数把原始数据映射到高维特征空间在高维空间里做线性PCA高维空间里的线性结构对应原始空间的非线性结构。MATLAB没有内置的KPCA函数但实现并不复杂核心是构造核矩阵再做特征分解。% KPCA最小实现使用RBF核 function [score_kpca, eigvals] mykpca(X, sigma) % X: 标准化后的n行m列数据 % sigma: RBF核宽度参数 n size(X, 1); % 构造核矩阵 K(i,j) exp(-||x_i - x_j||^2 / (2*sigma^2)) D pdist2(X, X, euclidean).^2; K exp(-D / (2 * sigma^2)); % 中心化核矩阵K K - 1_n K - K 1_n 1_n K 1_n one_n ones(n) / n; Kc K - one_n * K - K * one_n one_n * K * one_n; % 特征分解特征值从大到小 [V, D_eig] eig(Kc); [eigvals, idx] sort(diag(D_eig), descend); V V(:, idx); % 主成分得分归一化除以 sqrt(特征值) score_kpca V(:, 1:min(10, n)) ./ sqrt(eigvals(1:min(10, n))); end这段函数在数据规模小于几千时可以直接用数据量大了之后核矩阵占内存会爆炸。sigma的取值影响很大sigma太小每个点只和自己相似核矩阵接近单位矩阵sigma太大所有点都相似核矩阵接近全1矩阵。我一般用交叉验证或者按使得核矩阵条件数不至于过大的原则去试工程上常用默认sigma为所有样本两两距离的中位数。调用方式很简单X_std zscore(X_raw); [score_kpca, eigvals] mykpca(X_std, 2.0); % 用前两个核主成分做后续分析 Z_kpca score_kpca(:, 1:2);3.4 改进方向三鲁棒PCA——异常值占主导时的处理方案前面已经用到箱形图检测异常值但那是删点再降维的思路。另一种思路是鲁棒PCA它把数据矩阵分解为低秩矩阵加稀疏噪声矩阵本身就能抵抗异常值的干扰。MATLAB中实现鲁棒PCA常用迭代阈值法IT或增广拉格朗日乘子法ALM代码量不大。% 鲁棒PCA的增广拉格朗日乘子法简化版 function [L, S] robust_pca(X, lambda, max_iter, tol) % X: 原始数据矩阵n行m列 % lambda: 稀疏惩罚系数常用 1/sqrt(max(m,n)) [n, m] size(X); if nargin 2 || isempty(lambda) lambda 1 / sqrt(max(m, n)); end if nargin 3 || isempty(max_iter) max_iter 500; end if nargin 4 || isempty(tol) tol 1e-6; end Y X / max(norm(X, 2), 1e-6); % 拉格朗日乘子初始化 normX norm(X, fro); L zeros(n, m); S zeros(n, m); mu 1.25 / norm(X, 2); rho 1.5; for iter 1:max_iter % 更新低秩部分奇异值软阈值 [U, sigma, V] svd(X - S Y / mu, econ); sigma_thresh max(sigma - 1/mu, 0); L_new U * diag(sigma_thresh) * V; % 更新稀疏部分元素软阈值 S_new sign(X - L_new Y / mu) .* max(abs(X - L_new Y / mu) - lambda/mu, 0); % 更新拉格朗日乘子 Y Y mu * (X - L_new - S_new); mu mu * rho; % 收敛判断 err norm(X - L_new - S_new, fro) / normX; if err tol L L_new; S S_new; break; end L L_new; S S_new; end end用鲁棒PCA把数据拆成低秩部分L和稀疏部分S之后再对低秩部分做标准PCA得到的主成分方向就不会被个别离群点带跑。这个方法在金融指标、传感器数据这类异常值频出的场景里非常实用。值得强调的是lambda的取值对结果影响很大默认用1/sqrt(max(m,n))是经验值实际使用中如果发现稀疏部分包含大量非零元素说明lambda偏小需要调大。3.5 改进方向四稀疏PCA——让载荷矩阵变得可读原始PCA的载荷矩阵里每个主成分往往是所有指标的线性组合系数多为非零的小值解释起来很费劲。稀疏PCA在最大化方差的同时对载荷向量施加稀疏约束让一部分系数被压缩到零主成分只由少数几个指标构成业务解释性大幅提升。MATLAB从R2017b开始内置了sparsepca函数可以直接调用。% 稀疏主成分分析需要Statistics and Machine Learning Toolbox [coeff_sp, score_sp, explained_sp] sparsepca(X_std, ... NumComponents, 3, ... % 保留3个稀疏主成分 InitialTransform, standardize, ... MaxIterations, 2000); % 查看稀疏载荷很多位置应为0 disp(coeff_sp); % 得到稀疏主成分得分矩阵 Z_sp score_sp;解释一下参数NumComponents指定提取的稀疏主成分个数我一般先跑一遍标准PCA确认合理的主成分数量再把它带进sparsepca。InitialTransform设为standardize等价于先zscore。MaxIterations控制迭代轮数数据量大的时候可以适当调大以保证收敛。稀疏PCA每次运行的结果可能不同因为它用了随机初始化必要时固定随机种子对比几次运行结果确认哪些指标稳定进入同一个主成分。如果用的是老版本MATLAB没有sparsepca备选方案是把标准PCA结果做因子旋转rotatefactors也能得到近似的稀疏载荷结构但效果不如直接优化稀疏目标好。4. 指标主成分综合评价从得分到排名的完整流程4.1 为什么综合评价要用主成分而不是直接加权在做多指标综合评价时一个常见误区是直接给每个指标人为打分后加权求和。这种做法在指标间高度相关时是有问题的相关指标相当于被重复加权某个隐性因素因为被多个指标表征而在总体得分里被过度放大。主成分分析法的价值在于它先把原始指标压缩成互不相关的几个综合变量再用各主成分的方差贡献率作为权重得到综合得分。每个主成分代表的是原始指标背后的一个独立维度不是简单重复。用主成分做综合得分的另一个好处是权重由数据驱动不需要人为拍脑袋。这在评审类场景里尤其重要——权重可以解释为数据里实际存在的信息结构而不是某个人的经验偏好。当然数据驱动也有风险如果样本量小或者异常值多权重会被噪声左右所以综合评价前做异常值检测和标准化这两步不能省。4.2 计算综合得分的MATLAB脚本贡献率加权与归一化综合得分的计算逻辑分三步第一步标准化并做PCA第二步用贡献率做权重对主成分得分加权求和第三步把得分映射到0到100区间便于比较。% 综合得分计算完整脚本 % data: 第一列为样本ID第二列起为指标 X_raw data(:, 2:end); [n, m] size(X_raw); % 异常值处理先用箱形图标记这里简化为删除超过3倍标准差的样本 % 更稳妥的做法是用boxplot先看分布再手工决定 mu mean(X_raw); sigma std(X_raw); outlier_idx any(abs(X_raw - mu) 3 * sigma, 2); fprintf(检测到疑似异常样本数%d\n, sum(outlier_idx)); % 注意实际业务中是否删除需谨慎这里为了演示给出删除逻辑 X_clean X_raw(~outlier_idx, :); ID_clean data(~outlier_idx, 1); % 标准化 X_std zscore(X_clean); % PCA [coeff, score, latent, ~, explained] pca(X_std); % 保留累计贡献率 85% 的主成分个数 cum_contrib cumsum(explained); k find(cum_contrib 85, 1); fprintf(保留主成分个数%d累计贡献率%.2f%%\n, k, cum_contrib(k)); % 综合得分 sum(主成分得分 * 对应贡献率 / 100) weight explained(1:k) / 100; % 贡献率转权重 F score(:, 1:k) * weight; % 加权综合得分 F_norm 100 * (F - min(F)) / (max(F) - min(F)); % 归一化到0-100 % 输出带ID的排名表 result table(ID_clean, F, F_norm, ... VariableNames, {ID, RawScore, NormScore}); result sortrows(result, RawScore, descend); disp(result);这段脚本里有一个细节权重用的是贡献率但贡献率总和只有85%相当于所有主成分解释的信息总和。归一化到0到100只是为了展示方便如果业务上需要也可以不归一化直接看原始综合得分的排序。score(:, 1:k) * weight这一步做的是矩阵乘score的每行是一个样本在所有主成分上的得分weight是列向量乘出来的结果即加权和。提示综合得分计算前先检查前几个主成分的载荷符号方向。如果关键指标系数为负考虑将对应主成分得分乘-1或先对指标做正向化处理。用综合得分排序之前建议先检查前几个主成分的载荷方向。如果某个主成分的载荷里关键指标的符号是负的说明这个主成分的方向和该指标的业务意义相反直接加权可能得出违背直觉的排名。处理办法是把该主成分的得分乘以-1再加权或者在做PCA之前就对指标做正向化处理确保所有指标都是数值越大越好。4.3 一个完整案例24个城市、8个经济指标的PCA综合评价用一个结构清晰的小案例把上面的流程串起来。假设要评价24个城市的综合发展水平指标有8个包括生产总值、人均收入、固定资产投资、消费总额、进出口总额等量纲差异明显。% 假设数据在variables.xlsx中第1列是城市名第2~9列是8个经济指标 data readtable(variables.xlsx); city data{:, 1}; % 城市名cell数组 X data{:, 2:9}; % 指标矩阵 % 标准化 X_std zscore(X); % PCA [coeff, score, latent, ~, explained] pca(X_std); % 累计贡献率 cum_contrib cumsum(explained); fprintf(累计贡献率); fprintf(%.2f%% , cum_contrib); fprintf(\n); % 假设前3个主成分累计达到90% k 3; weights explained(1:k) / sum(explained(1:k)); % 只用保留主成分的贡献率重新归一化 F score(:, 1:k) * weights; F_norm 100 * (F - min(F)) / (max(F) - min(F)); % 输出排名 [sortedF, idx] sort(F_norm, descend); fprintf(排名\t城市\t综合得分\n); for i 1:length(sortedF) fprintf(%d\t%s\t%.2f\n, i, city{idx(i)}, sortedF(i)); end这里有个权重处理的细节变化我在示例里把权重改成explained(1:k)/sum(explained(1:k))也就是只在保留的主成分内部重新归一化权重而不是直接用原始explained。原因是如果前3个主成分累计贡献率是90%直接用90%对应的贡献率相加综合得分等于丢失了另外10%的信息。两种做法在排序上差别不大但前一种解释更直观我也更推荐。5. 主成分分析MATLAB程序的避坑指南常见问题与排查5.1 现象pca()报错数据包含NaN或包含有限值缺失明明看数据文件没什么问题一跑pca就报错提示输入包含NaN。这种情况十有八九出现在用readmatrix或xlsread读Excel时空单元格被读成了NaN。另一种来源是计算过程中出现的除零比如某列数据全是同一个常数zscore算出来的标准差为0除以0得到NaN。排查思路是先用sum(isnan(X))逐列统计NaN数量定位到具体是列全空还是个别单元格空。解决方式有两种一是读取后直接删除含NaN的行适合NaN比例低于5%的情况二是用均值或中位数填充适合指标本身的缺失规律不明显、且后续要用相关性矩阵的场景。如果是标准差为0导致的NaN说明这个指标在整个数据集里没有区分度直接把这一列删掉更合理。顺带一提如果是拿到别人写的matlab代跑程序第一件事就是检查它的数据读入部分是否处理了NaN很多程序跑出来结果异常根因在读取阶段就埋下了。5.2 现象第一主成分贡献率异常低或异常高正常场景下如果多个指标确实描述同一个大概念第一主成分贡献率在50%~80%之间比较常见。但如果第一主成分贡献率低于30%通常说明指标之间的相关性太弱主成分分析硬把不相关的东西捏在一起这种情况下提取出的主成分含义会很模糊。如果贡献率高于95%也要警惕最常见的原因是异常值没有处理——一个离群点就能把方差拉出一个尖峰导致第一主成分的方向几乎指向这个点。解决思路要看具体原因。贡献率低时先检查指标之间有没有明显的不相关组必要时把指标按业务领域拆成几组分别做主成分分析而不是硬压到一起。贡献率过高时画箱形图查异常值或者跑一遍鲁棒PCA对比第一主成分的方向变化。注意一个细节异常值在标准化后依然有影响因为zscore的均值和标准差本身就被异常值污染了所以真正稳妥的顺序是先检测并处理异常值再做标准化。5.3 现象载荷矩阵的符号和文献结果相反特征向量乘以-1之后仍然是特征向量这是PCA的固有性质不是程序错误。对比不同来源的载荷矩阵时出现所有系数整体变号属于正常情况。真正的错误是把不同主成分之间的符号混在一起比较。解决方式是在落地前人工统一符号方向。常见做法是选一个在主成分上载荷绝对值最大且业务预期为正的指标如果它的载荷是负的就把这个主成分对应的载荷列和得分列都乘以-1。这样主成分的业务含义就稳定了。在写综合评价脚本时这一步不要省否则可能出现某个样本的得分因为符号问题被整体反转的怪异排名。5.4 现象改进PCA跑出来的排名和标准PCA差很多用了核PCA或者鲁棒PCA之后排名出现较大变化不一定是坏事但要区分变化来源。如果数据本身线性结构良好标准PCA和改进方法的排名应该大体一致差距大说明数据里存在某种结构性问题改进方向的差异在起作用。最常见的翻车点有两个一是KPCA的sigma选得不合适导致核矩阵退化改进结果反而丢失信息二是鲁棒PCA的lambda对象错误把大量正常数据当成了稀疏噪声。排查时先把改进方法的结果和标准PCA结果画散点对比。如果点基本落在对角线上说明差异可控如果散成一片就要回到参数检查。KPCA可以先试几个sigma比如0.5、1、2、5看哪个sigma下前两个主成分的累计方差占比最高选一个比较稳定的区间。鲁棒PCA则要看稀疏矩阵S的非零元素占比一般控制在5%以内比较合理超过这个比例说明lambda需要调大。6. 把改进PCA程序落地三个自检习惯与一个验证脚本6.1 写一个自检函数每次跑完PCA自动输出关键诊断量我习惯在项目里维护一个自检脚本固定输出四样东西累计贡献率表、载荷矩阵显著系数表阈值0.3以上、前两个主成分的散点图、以及每个样本在综合得分中的排名变化。这样每次换数据、换参数都能快速判断结果是否合理。% pca_diagnose.mPCA结果自检 function pca_diagnose(X_std, coeff, score, explained) % 1. 累计贡献率 cum_contrib cumsum(explained); n_pc find(cum_contrib 85, 1); if isempty(n_pc) n_pc length(cum_contrib); end fprintf(累计贡献率超过85%%的主成分个数%d\n, n_pc); % 2. 显著载荷筛选阈值0.3 [i, j] find(abs(coeff) 0.3); fprintf(载荷绝对值超过0.3的位置数%d\n, length(i)); % 3. 前两个主成分散点图 figure; scatter(score(:,1), score(:,2), 20, filled); xlabel(PC1); ylabel(PC2); title(主成分得分分布); end这个自检函数本身不复杂价值在于把看一眼有没有异常固化成流程。参数调完一轮先跑自检再去看排名细节。养成这个习惯之后大部分因为数据预处理不当造成的翻车都能在第一轮就被拦下来。6.2 三个参数层面的习惯固定随机种子、记录版本、保留原始数据改进PCA涉及随机初始化稀疏PCA和迭代算法鲁棒PCA我必须先固定随机种子再跑否则同一份数据两次运行结果对不上。固定种子用rng(1)之类的一行命令。第二件是记录每次运行时的版本环境MATLAB版本会影响sparsepca这类内置函数的可用性我吃过R2016b没有sparsepca、临时换算法实现的亏。第三件是永远保留原始数据和清洗后数据的对照别在预处理链路上直接覆盖变量。6.3 验证改进是否真的有效一个朴素但可靠的对比方法改进有没有价值用同一份数据跑标准PCA和改进PCA对比三组指标主成分的累计解释方差、业务解释性打分、以及最终评价排名与业务先验的吻合度。如果改进后累计贡献率只提升了一两个百分点但业务解释性明显变好那改进是有价值的反过来如果贡献率提升了但排名大乱就要检查是不是过度拟合了异常结构。我自己的经验是把降维结果的可解释性放在数学指标之前毕竟主成分分析产出的最终受体是业务决策者他们看不懂奇异值但一定能看懂第一主成分代表规模因子这种表述。做了这些年主成分分析相关的项目最深的教训是不要迷信改进。标准PCA在大部分干净数据上已经够用改进方法是为了应对明确识别出的问题而存在——有异常值才上鲁棒PCA有非线性才上核PCA载荷难解释才上稀疏PCA。先诊断再选方法最后用自检确认效果这条链路走通了主成分分析才能真正变成一个稳定的工具。希望帮到你。本文还有配套的精品资源点击获取
返回列表