简介:这份MATLAB程序集以主成分分析法(PCA)及改进版为核心,专为数据降维、指标提取与综合评价场景设计,适合统计建模、数据挖掘和机器学习方向的开发者与科研人员使用。程序实现既包含数据标准化、协方差矩阵计算、特征值分解、主成分排序与得分求解等标准流程,也引入针对过拟合和噪声干扰的优化思路,并在指标主成分计算方面提供相对贡献值处理方案,可帮助读者在压缩特征维度的同时保留关键信息,支撑后续回归、分类或综合打分任务。压缩包共包含1个m源码文件,体积仅1KB,代码精炼、无冗余依赖,既可快速运行,也便于逐行调试和二次开发;主成分数量选择、累计贡献率阈值(如90%或95%)等参数均可按业务场景自行调整,适合作为PCA教学示例、算法对比基线或工程改造蓝本。平台显示已有510人学习,说明其对正在学习或实践PCA的MATLAB用户具有较强的实用性,尤其适合希望从代码层面理解改进思路的进阶读者。
1. 主成分分析法不是黑匣子:从一份 zhuchengfen.m 看 PCA 的落地与改进
主成分分析法(PCA)大概是数据降维里被用得最多、也最容易跑偏的方法。很多人拿着数据就丢进pca(),不预处理、不核对特征向量方向、不关心主成分到底代表什么,结果得分图画出来怎么解释都不对,最后只能改阈值凑结论。zhuchengfen.zip 里这份zhuchengfen.m,是一个用 MATLAB 自写主成分分析及改进算法的完整程序,把协方差矩阵、特征值分解、指标相对贡献值这些步骤全部摊开在代码里。对做数据分析、写论文、以及想看懂 PCA 内部过程的人来说,这份资源比 MATLAB 内置黑匣子更容易改、更容易查。下面按“原理 → 调用 → 改进 → 踩坑 → 验证”的顺序,把整份程序拆开讲。
2. 主成分分析法的核心步骤:标准化、协方差矩阵与特征值分解
2.1 为什么先标准化:量纲问题不是可选项
PCA 在数学上做的是方差最大化。如果原始指标里有一个量级特别大的变量,比如销售额单位是元、另一个指标是比率,直接算协方差矩阵,销售额的方差会压倒性占主导,主成分几乎完全跟着它跑,其他指标的信息被压缩掉。这个不是算法问题,是数据尺度问题。所以跑 PCA 之前必须做标准化或归一化。最常规的选择是 z-score 标准化,让每个指标均值为 0、标准差为 1。
X_std = (X - mean(X)) ./ std(X); % 或者直接用内置函数 X_std = zscore(X);这段代码看起来简单,但有两点要留意。第一,std(X)默认对每一列求标准差,方向是 1,也就是按指标求,行是样本,这个布局和 zhuchengfen.m 的输入约定要一致。第二,mean(X)和std(X)都是按列统计,如果原始数据是变量在列、样本在行,没问题;如果数据结构相反,必须先X = X'转置,否则整个 PCA 意义都变了。
标准化还有另一种选择:最小最大归一化。它把数据映射到 [0,1] 区间,公式是(X - min(X)) ./ (max(X) - min(X))。做主成分分析时,我一般不推荐它,因为 min-max 对离群点非常敏感,一个极端值会把整列数据压缩到很小的范围,导致标准差失真。z-score 虽然也受离群点影响,但至少保留了方差结构。所以 zhuchengfen.m 这类以特征提取为目标的程序,预处理部分直接用 z-score 最稳妥。我习惯在程序开头加一行断言,检查行数是否大于列数,避免低维样本强行跑高维 PCA。
标准化之后,协方差矩阵和数据的总方差就有明确对应关系。标准化后的协方差矩阵实际上等于相关系数矩阵,对角线全为 1,非对角线表示指标间的线性相关性。这一步做完,后面特征值分解的结果才有可解释性。
2.2 协方差矩阵与特征值分解:主成分方向从哪来
PCA 的核心是把协方差矩阵分解成特征值和特征向量。特征向量定义了新坐标系的方向,也就是主成分方向;特征值表示沿该方向的数据方差。MATLAB 里做特征值分解有两个常用入口:eig和svd。最直接的教学实现是:
C = cov(X_std); [V, D] = eig(C); % eig 返回的特征值按升序排列,这里重排成降序 [~, idx] = sort(diag(D), 'descend'); V = V(:, idx); D = D(idx, idx); latent = diag(D);这段代码里V的每一列是一个主成分方向(也叫载荷),D是特征值对角矩阵,latent就是各主成分对应的方差。很多人第一次跑eig会拿到升序排列的特征值,不加排序直接取第一列,结果第一个主成分根本不是方差最大的方向,这是新手最容易犯的错。V中列的方向并不唯一:eig给出的特征向量乘以 -1 仍然是特征向量,所以两个程序算出来的载荷可能正好差一个负号,这是正常的,不是算错了。
用eig分解协方差矩阵在样本量远大于变量数的场景下没问题。但如果变量数接近或超过样本数,协方差矩阵会奇异或病态,eig的数值稳定性会变差,推荐改用svd:
[U, S, V] = svd(X_std, 'econ'); % S 的对角线是奇异值,平方后与协方差矩阵的特征值成正比 latent = diag(S).^2 / (size(X_std, 1) - 1);svd对数据矩阵直接做奇异值分解,不显式计算协方差矩阵,数值上更稳定。zhuchengfen.m 如果做了算法层面的改进,大概率会在这里替换成 SVD 路径。理解这一点,读程序时能立刻抓住作者的实现选择。
还要理解特征值的几何意义。协方差矩阵是一个对称半正定矩阵,特征向量是它在高维空间中的主轴方向,特征值是沿主轴方向的数据散布程度。第一个特征值最大,表示第一个主成分方向上的数据波动最剧烈;第二个次之,而且第二个特征向量与第一个正交,表示它在剩余信息里再挑一个最大的方向。这样一层层剥离,就是 PCA 的完整过程。
2.3 主成分得分与贡献率:这些矩阵怎么算
主成分得分是原始数据在新坐标系下的坐标,贡献率则决定保留几个主成分。得分矩阵的计算就是标准化数据乘上载荷矩阵:
score = X_std * V; explained = latent / sum(latent) * 100; cumexplained = cumsum(explained);score的每一列对应一个主成分,第一列是第一个主成分的得分,第二列是第二个,以此类推。explained是每个主成分解释总方差的百分比,cumexplained是累计贡献率。论文里常见的“前三个主成分累计贡献率 92%”就是从这里来的。
这里有个容易混淆的点:score的标准差应该等于对应特征值的平方根,也就是std(score) ≈ sqrt(latent)。如果算出来不等于,说明载荷或数据的某个环节算错了。我一般会拿这个关系做自检。explained的阈值通常取 85%~95%,但这不是硬标准,后面会讲到动态选择主成分数的方法。
这四组输出是 PCA 程序的标准接口,整理成表格方便对照:
| 变量 | 维度 | 含义 |
|---|---|---|
| score | 样本数 × 主成分数 | 原始数据在新坐标系下的坐标 |
| coeff / V | 变量数 × 主成分数 | 主成分方向,即载荷矩阵 |
| latent | 主成分数 × 1 | 各主成分对应特征值 |
| explained | 主成分数 × 1 | 各主成分解释总方差的百分比 |
在做结果解释时,coeff的每一列代表一个综合指标,它的绝对值大小反映原始变量在这个综合指标里的权重。score则用于后续建模、聚类或画分布图。所以一份完整的 PCA 程序至少要返回这四个量,zhuchengfen.m 如果输出比这多,多出来的部分通常就是“指标相对贡献值”和“改进后选主成分数的结果”。
3. 把 zhuchengfen.m 用起来:输入输出、调用方式与参数调整
3.1 程序结构判断:这个 m 文件里大概有什么
zhuchengfen.zip 里只有一个zhuchengfen.m,没有数据文件,也没有额外的函数说明。所以这个文件本身应该是一个自包含的脚本或函数。常见做法是写成函数:输入原始数据矩阵X,返回主成分得分、特征值和贡献率,同时把改进选项作为参数传递。下面这个接口是结合摘要描述和类似工程习惯补全的示例,不是仓库里的原始代码,但结构上与典型实现一致:
function varargout = zhuchengfen(X, varargin) % 主成分分析及改进 % 输入: % X : 样本矩阵,行是样本,列是指标 % 参数对: 'Standardize', true, 'Method', 'classic', 'CumRatio', 95 % 输出: % score : 主成分得分 % latent : 特征值 % explained : 各主成分贡献率(%) p = inputParser; addRequired(p, 'X', @(x) isnumeric(x) && size(x,1) > size(x,2)); addParameter(p, 'Standardize', true, @islogical); addParameter(p, 'Method', 'classic', @ischar); addParameter(p, 'CumRatio', 95, @(x) x > 0 && x <= 100); parse(p, X, varargin{:}); % 以下接标准 PCA 步骤... end这种结构的优点是参数全走inputParser,后续扩展方法不用改函数调用方式。读这个 m 文件时,优先级最高的部分是输入参数解析和主流程:标准化是否强制、有没有方法分支、最终返回几个值。如果文件是脚本而不是函数,那它通常直接操作工作区变量X,并在尾部输出score、latent、explained,这种写法便于调试,但复用性差。
实际调用前,我会先用一份已知结构的数据试探运行:
rng(2024); X = randn(60, 8); % 60 个样本,8 个指标 [score, latent, explained] = zhuchengfen(X, 'Standardize', true, 'CumRatio', 90);如果程序报错,先看是不是output argument数量不匹配。因为自定义函数可能固定输出 3 个或 4 个量,用varargout的版本会灵活一些。拿到输出后,立刻检查size(score, 2)是不是和find(cumsum(explained) >= 90, 1)一致,这是判断程序是否正确执行动态选主成分的最快手段。
3.2 运行前检查:数据维度、缺失值、常量列
跑 PCA 前最忌讳默认数据没问题。实际落地时,我一般会在程序入口处加三行检查:数据是否满秩、是否有缺失值、是否有常量列。这三类问题在原始数据里太常见了,却不会报红,结果算出来的贡献率全是 NaN。
if any(isnan(X(:))) error('输入数据包含 NaN,请先插补或删除缺失行'); end if any(std(X, 0, 1) < eps) error('存在常量列,该指标不包含任何信息,请删除'); end if size(X, 1) < size(X, 2) warning('样本数小于变量数,协方差矩阵可能奇异,建议改用 SVD 或 PLS'); endany(std(X, 0, 1) < eps)是检查每列标准差是否接近零。常量列在标准化时会变成 NaN,这个坑非常隐蔽。缺失值也是一样,MATLAB 的cov遇到 NaN 会直接返回 NaN,后续特征值分解全部失效。zhuchengfen.m 如果包含了“动态选择主成分数量、处理缺失值”这类改进,入口处的预处理逻辑大概率就在这些位置。
处理缺失值时,删除整行是最简单的做法,代价是丢掉样本。如果缺失比例不高,可以用均值填充:
X_filled = fillmissing(X, 'linear');但这只适合机械性缺失。如果缺失和业务有关,比如高收入人群的某项指标常常不填,那填充会引入偏倚。对 PCA 而言,我更倾向做逐变量插补,再用插补后的数据做标准化,两者不要混在一步里。
3.3 用 MATLAB 内置 pca() 对照验证
用 zhuchengfen.m 算完结果后,最有效的验证不是看它跑没跑通,而是拿 MATLAB 内置pca()做对照。内置函数的返回值和自定义实现应该一致:
[coeff, score, latent, tsquared, explained] = pca(X_std);注意内置pca()默认对数据做中心化(Centered=true),但不做标准化。zhuchengfen.m如果默认标准化,两者结果会有差异。对照时要把预处理统一:要么两边都先zscore,要么两边都不标准化。另外,coeff和自定义V可能存在整列符号相反的情况,这是同一方向的正负翻转,不影响降维和重构,但影响载荷解释。做对照验证时不要直接isequal,要先检查绝对值或固定符号。
更完整的对照流程是写一个自动比较函数:
[coeff2, score2, latent2, ~, explained2] = pca(zscore(X)); diffExp = max(abs(explained(:) - explained2(:))); if diffExp < 1e-8 disp('PCA 结果与内置函数一致'); else disp(['存在差异,差值为 ' num2str(diffExp)]); end我把这个片段写进验收入口,每次自定义程序改动后都跑一遍。只要explained一致,就说明协方差矩阵分解、特征值排序、贡献率计算这三个环节都没问题。再往下就是检查载荷符号,那是解释层的事,不影响数值正确性。
4. 指标主成分与改进策略:相对贡献值、PCR 与正交化
4.1 指标主成分:相对贡献值怎么计算和解读
摘要里特别提到了“指标主成分”和“相对贡献值”。这里的“指标”指原始变量,相对贡献值是用来回答“哪个原始指标对某个主成分贡献最大”的量化工具。在 MATLAB 里,载荷矩阵V的每个元素平方表示该原始指标与该主成分的关联强度,把某一列归一化后就是相对贡献。
% 计算每个原始指标对每个主成分的相对贡献(%) contrib = (V.^2) ./ sum(V.^2, 1) * 100;contrib的第 i 行第 j 列表示第 i 个原始指标对第 j 个主成分的贡献百分比。比如第一主成分上指标 3 的贡献是 78%,说明该主成分主要由指标 3 驱动,可以把第一主成分理解为指标 3 的综合表达。做“指标主成分”分析的论文,通常会在结果里给这样一张表:行为原始指标,列为主成分,表格里是贡献值,然后挑出每列最大值的指标做解释。
下面是一个典型输出示例:
| 原始指标 | PC1 贡献(%) | PC2 贡献(%) | PC3 贡献(%) |
|---|---|---|---|
| 指标1 | 52.3 | 12.1 | 3.2 |
| 指标2 | 28.7 | 8.4 | 15.6 |
| 指标3 | 4.5 | 61.8 | 2.1 |
| 指标4 | 14.5 | 17.7 | 79.1 |
从这个表可以读出的信息是:PC1 基本由指标1和指标2解释,PC2 主要由指标3驱动,PC3 对应指标4。实际业务里,这些数字通常会进一步加工成“综合得分”模型的权重。但这里有一个容易忽略的误区:相对贡献值高不代表因果。它只是线性投影的权重,如果原始指标本身高度相关,贡献会被均摊,两个相关指标各占 40% 也是常见情况。所以表格只能用来辅助解释,不能直接拿去下结论。
4.2 改进方向一:主成分回归 PCR
摘要里所说的“主成分改进”,最常见的落地是主成分回归(PCR)。PCR 的做法是先用 PCA 降维,取前 k 个主成分得分作为新的回归自变量,再对因变量做线性回归。它专门解决自变量高度多重共线性时最小二乘估计不稳定的问题。
[~, score, ~] = pca(zscore(X), 'NumComponents', k); beta_pcr = score \ y; % 在得分空间做回归 beta_orig = V(:,1:k) * beta_pcr; % 还原到原始变量空间第二行score \ y是最小二乘,只是求解对象是主成分得分。第三行把回归系数映射回原始变量空间,方便和普通线性回归的系数对比。这里k的选择直接决定模型质量:k 太小,丢掉了解释 y 的关键信息;k 太大,又把噪声学进去。多数实现会默认按 95% 累计贡献率选区,更稳健的做法是用后面要讲的交叉验证。
PCR 与普通回归最大的区别在于,它在降维阶段完全不知道 y 的存在。所以可能出现某个主成分方差很大但与 y 无关,PCR 还是会把它选进来。这时候模型的预测精度不一定比直接岭回归好。所以我把 PCR 定位为“处理共线性”的工具,而不是“提升预测精度”的工具。如果目标是预测,优先考虑 PLS。
4.3 改进方向二:偏最小二乘与正交主成分分析
摘要还提到了 PLS 和正交主成分分析(OFA)。这部分是 PCA 的常见改进路线,MATLAB 里都有内置工具箱可用,zhuchengfen.m 如果扩展了这些方法,通常是在输出里多一个 method 选项。
| 方法 | 核心思路 | MATLAB 入口 | 适用场景 |
|---|---|---|---|
| PCA | 最大化 X 的方差 | pca / svd | 无监督降维、特征提取 |
| PCR | PCA 降维后回归 | pca + regress | 有共线性的回归问题 |
| PLS | 同时最大化 X 与 y 的协方差 | plsregress | 自变量多、样本少、y 和 X 强相关 |
| OFA | 对主成分施加正交约束 | 自实现 | 需要正交可解释成分的场景 |
PLS 和 PCA 最大的差别是 PLS 在降维时考虑了因变量 y 的信息,所以它选出的成分更适合预测。OFA 则是在 PCA 基础上增加约束,让每个成分和业务上的分组或标签正交,这样提取出来的成分之间没有重叠,解释起来更干净。如果你的数据只有 X、没有 y,那 OFA 和 PLS 都无从谈起,老老实实用 PCA 或 PCR 就行。
如果 zhuchengfen.m 里做了 PLS 改进,调用方式通常长这样:
[XL, YL, XS, YS, BETA] = plsregress(X, y, 3);这里的BETA是回归系数,XS是 X 的得分,YL是 y 的载荷。PLS 回归系数的解释比 OLS 复杂,因为它是投影空间里的结果,不能直接说“X 每增加一个单位,y 增加 BETA 个单位”。论文里用 PLS 时,更常报告 VIP 分数来评估变量重要性,而不是原始系数。
4.4 zhuchengfen.m 里可能埋的改进点
读这个 m 文件时值得留意三个改进点。第一,动态选择主成分数。经典 PCA 写死“前两个主成分”,改进版一般会根据累计贡献率或特征值大于 1 的规则自动定 k:
cumvar = cumsum(explained); k = find(cumvar >= 95, 1, 'first');第二,主成分方向符号固定。由于特征向量符号不唯一,同一数据集两次运行可能得到符号相反的载荷。为了结果可复现,改进版会在排序后统一每列符号,比如让每列绝对值最大的元素为正:
for j = 1:size(V, 2) [~, m] = max(abs(V(:, j))); if V(m, j) < 0 V(:, j) = -V(:, j); end end第三,计算效率优化。用 SVD 替代eig(cov(X)),直接对数据矩阵分解,矩阵规模大时内存占用更低。如果你打开 zhuchengfen.m 发现里面有svd、cumsum、find这几个关键命令,那这个文件的核心就在这三处。这些改进单独看都不复杂,组合起来就是一份能实际交付的 PCA 工具。
实际阅读代码时,我会按“输入解析 → 预处理 → 分解 → 选主成分 → 输出”五段去定位。前两段看健壮性,中间两段看算法选型,最后一段看接口设计。绝大多数教学用 PCA 程序都卡在“选主成分”这一步,要么写死 k,要么只给累计贡献率表格,没有自动决策逻辑。有改进版本的 zhuchengfen.m,这一段会明显更复杂,值得重点抄作业。
5. 避坑与常见问题:PCA 跑出来不对,先查这五处
5.1 得分图镜像翻转,主成分方向与教材相反
现象:用相同数据跑 zhuchengfen.m 和教材上的例子,第一主成分载荷的数值相同但符号全反,得分图左右镜像。
原因:特征向量本来就不是唯一,eig和svd在数值求解时可能返回任意一个方向,乘以 -1 仍然是合法特征向量。这个不是程序 bug,但会导致书上的图表和你算出来的正好翻转。
解决:在程序里固定特征向量符号。最常用的是让第一列中绝对值最大的元素取正,代码见 4.4 节。符号统一后,载荷解释和得分图的方向才能稳定复现。这属于“看结果前先处理”的步骤,不要等到论文插图做完了再对。
5.2 不标准化就跑 pca,量纲大的变量统治结果
现象:直接对原始数据调用pca(),出来的前两个主成分几乎只由销售量这个指标决定,其他指标贡献率接近零。
原因:内置pca()默认只做中心化,不做标准化。当指标量纲差异大时,方差大的指标天然占据主成分方向,这是 PCA 的数学性质,不是数据问题。
解决:跑任何 PCA 之前,先让所有指标处在同一个尺度。用zscore(X)或自定义标准化。如果因为业务原因不能标准化,至少要在读结果时说明主成分是按原始协方差结构计算的,不能拿贡献率去比较不同量纲的指标。我在用pca(X, 'Centered', true)时也会再手动检查一次std(X),确保没有漏掉标准化。
5.3 累计贡献率 99% 但降维后模型变差
现象:选 95% 累计贡献率的时候主成分数还是很多,降到 5 个主成分分数后分类或回归模型效果反而下降,而前两个主成分的二维可视化也看不出区分度。
原因:累计贡献率高只代表保留了方差,不代表保留了分类或回归需要的判别信息。PCA 是无监督方法,它不感知标签 y,方差大的方向不一定和 y 相关。两个类别之间的差异如果恰好落在低方差方向,PCA 会把它丢掉。
解决:在有监督任务里用交叉验证选主成分个数,或者直接换 PLS 这类考虑了 y 的方法。至少要有意识地同时查看特征值肘部图和下游任务性能,别再只盯着累计贡献率。这个坑在我早期做特征工程时踩过很多次,后来默认规则变成:无监督探索看累计贡献率,有监督建模必须看验证集误差。
5.4 MATLAB 打开 m 文件中文注释乱码
现象:下载的 zhuchengfen.m 用 MATLAB 打开后,中文注释变成“锟斤拷”或一坨乱码,程序还能跑但不方便读。
原因:文件本身可能是 GBK/GB2312 编码保存的,而较新版本的 MATLAB 编辑器默认按 UTF-8 解析,或者反过来。MATLAB 2023b 及之后的版本对编码更敏感,老项目文件经常会遇到。
解决:不要先在记事本里另存,那可能把编码改乱。在 MATLAB 编辑器中用“打开”对话框里选择文件编码,或者在命令行执行edit zhuchengfen.m后,通过“文件 → 另存为”选择 UTF-8 编码保存。我遇到类似情况时会先用fread读文件头,再判断是 GBK 还是 UTF-8,但日常用编辑器打开重存最快。保存后重新打开,确认注释正常再继续改代码。
5.5 协方差矩阵奇异或特征值出现负数
现象:样本数不多、变量数很多的数据,跑 PCA 时latent出现很小的负数,或者累计贡献率超过 100%,score里有 NaN。
原因:变量数接近或超过样本数时,协方差矩阵不满秩,eig分解会出现数值误差。还有一种常见情况是存在严格线性相关的变量,比如两个指标互为比例,矩阵就奇异了。
解决:优先检查数据是否有重复或线性相关的列,删掉后重跑。如果变量数仍然很多,改用 SVD 路径,不要让代码用eig(cov(X))。更彻底的办法是嵌套交叉验证或稀疏 PCA,但那是另一个工程了。对 zhuchengfen.m 这类教学资源,SVD 替换是最快、最稳的修复。排查时先执行rank(cov(X_std)),看到秩小于列数,基本就坐实了问题。
6. 进阶技巧:用交叉验证选主成分数,把 zhuchengfen.m 变成通用函数
主成分个数是 PCA 里唯一需要拍板的超参数,但大多数程序里直接写死了累计贡献率。要让它更可信,我会用 K 折交叉验证从重构误差和下游任务误差两个角度选 k。下面这段以重构误差为指标,思路是:把训练集投影到前 k 个主成分上再重构,计算测试集的残差平方和,k 太小重构不准,k 太大则把噪声也保留下来,最小点往往对应最佳维度。
rng(42); cv = cvpartition(size(X, 1), 'KFold', 5); maxk = min(size(X, 2), size(X, 1) - 1); mse = zeros(1, maxk); for k = 1:maxk for i = 1:cv.NumTestSets trIdx = training(cv, i); teIdx = test(cv, i); Xtr = zscore(X(trIdx, :)); Xte = zscore(X(teIdx, :)); [coeff, score] = pca(Xtr, 'NumComponents', k); XtrHat = score * coeff' + mean(X(trIdx, :)); XteHat = (Xte * coeff) * coeff' + mean(X(trIdx, :)); mse(k) = mse(k) + mean((X(teIdx, :) - XteHat).^2, 'all'); end end [~, bestk] = min(mse);这段代码里,zscore必须分别在训练折内计算均值和标准差,再用同样的均值和标准差去标准化测试折,避免信息泄漏。测试折的投影用训练折得到的coeff,这是评估泛化能力的关键。bestk不是越大越好,交叉验证曲线会在某个点后不掉反升,那个点就是主成分数的上限。
除了重构误差,还可以用主成分得分做回归或分类,在测试折上计算预测误差。两种选法各有侧重:重构误差关心数据本身的信息保留,预测误差关心下游任务的表现。实际项目里我会把两个曲线画在同一张图上,如果两条曲线的最优点接近,说明选出的 k 很稳;如果差很远,说明数据里存在与业务标签相关的低方差结构,这时应该优先考虑 PLS 而不是 PCA。
得到bestk后,可以把 zhuchengfen.m 的输出参数改成结构体:result.score、result.loadings、result.explained、result.bestk,这样一个函数同时覆盖教学演示和实际建模。从那以后我每次跑 PCA 都强制走一遍“先标准化 → 检查奇异值 → 交叉验证选 k → 固定符号 → 输出贡献率表”这五个动作,这套流程基本消除了我早期踩过的所有符号翻转和过度拟合坑。zhuchengfen.zip 里的这份 MATLAB 程序适合当作这套流程的底稿,拿来改比从零写省力得多。希望帮到你。
本文还有配套的精品资源,点击获取