正在加载中...

展开本页目录
算法教程KPCA-核主成分

KPCA-核主成分

No.124 · 在线教程

核主成分分析(Kernel PCA, KPCA)是在 PCA 基础上引入核技巧得到的非线性降维方法。它的核心思想是:先通过核函数把样本隐式映射到高维特征空间,再在该特征空间中执行类似 PCA 的特征分解,从而提取能够刻画非线性结构的低维表示。

KPCA-核主成分

1. 方法概述

核主成分分析(Kernel PCA, KPCA)是在 PCA 基础上引入核技巧得到的非线性降维方法。它的核心思想是:先通过核函数把样本隐式映射到高维特征空间,再在该特征空间中执行类似 PCA 的特征分解,从而提取能够刻画非线性结构的低维表示。

本项目中的 KPCA-核主成分 模块并不是自写核矩阵求解器,而是对 sklearn.decomposition.KernelPCA 的工程化封装。当前代码支持:

  1. rbfpolylinearsigmoidcosine 五种核函数;
  2. nonestandardminmax 三种特征预处理;
  3. 可选的逆变换 fit_inverse_transform
  4. 可选输出重构误差 reconstruction_mse
  5. 输出核特征值、项目内定义的解释率、降维结果和图表。

设共有 \(n\) 个样本、\(p\) 个参与分析的特征。记原始特征矩阵为

$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$

当前模块约定第 1 列作为样本/对象标识列,其余列为数值型特征。与部分聚类模块不同,KPCA-核主成分 对首列是否重复不做阻断校验,只要其余特征列有效即可进入计算。

2. 数据要求与预处理

2.1 数据约束

根据 upload_widget.pyindicators_widget.pydata_validator.py 的实现,模块对输入数据的真实要求如下:

  1. 数据不能为空;
  2. 至少包含两列,即第 1 列对象名称和至少 1 列特征;
  3. 第 2 列及以后必须为数值型;
  4. 特征列不能含空值;
  5. 至少选择 1 个特征用于 KPCA;
  6. 若存在常数列,程序会给出警告提示,但不会阻止继续计算。

其中第 6 点很重要:KPCA 模块与一些聚类模块不同,常数列只会触发提醒消息,不会直接报错退出。

2.2 Z-score 标准化

normalization="standard" 时,程序调用 StandardScaler 对每一列执行

$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$

得到标准化后的特征。

2.3 Min-Max 归一化

normalization="minmax" 时,程序调用 MinMaxScaler 执行

$$ z_{ij}=\frac{x_{ij}-x_j^{\min}}{x_j^{\max}-x_j^{\min}} \tag{3} $$

normalization="none",则直接令

$$ z_{ij}=x_{ij} \tag{4} $$

记实际进入 KernelPCA 的矩阵为

$$ Z=(z_{ij})_{n\times p} \tag{5} $$

2.4 符号说明

符号 含义
\(n\) 样本数量
\(p\) 特征维数
\(q\) 输出维度 n_components
\(z_i\) 第 \(i\) 个样本的预处理后特征向量
\(\phi(\cdot)\) 隐式特征映射
\(K\) 核矩阵
\(K_c\) 中心化后的核矩阵
\(\lambda_r\) 第 \(r\) 个核特征值
\(t_{ir}\) 样本 \(i\) 在第 \(r\) 个核主成分上的投影

3. 核心数学模型

3.1 隐式映射与核函数

KPCA 假设样本 \(z_i\) 被映射到某个高维特征空间:

$$ z_i \mapsto \phi(z_i) \tag{6} $$

但算法并不显式计算 \(\phi(z_i)\),而是通过核函数

$$ k(z_i,z_j)=\langle \phi(z_i),\phi(z_j)\rangle \tag{7} $$

来间接刻画样本在高维空间中的相似性。当前项目暴露的核函数包括:

  1. linear
  2. rbf
  3. poly
  4. sigmoid
  5. cosine

3.2 核矩阵与中心化

对全部样本,核矩阵定义为

$$ K=(K_{ij})_{n\times n},\qquad K_{ij}=k(z_i,z_j) \tag{8} $$

KPCA 需要对核矩阵进行中心化。记

$$ H=I_n-\frac{1}{n}\mathbf{1}\mathbf{1}^\top \tag{9} $$

则中心化后的核矩阵可写为

$$ K_c=HKH \tag{10} $$

本项目没有手工编写这一步,而是直接交给 sklearn.decomposition.KernelPCA 完成。

3.3 特征分解与低维表示

在标准 KPCA 推导中,需要对中心化后的核矩阵求解特征值问题:

$$ K_c\alpha_r=n\lambda_r\alpha_r \tag{11} $$

再据此得到样本在第 \(r\) 个核主成分方向上的投影。记第 \(i\) 个样本在第 \(r\) 个成分上的低维坐标为 \(t_{ir}\),则最终低维表示可以写成

$$ T=(t_{ir})_{n\times q} \tag{12} $$

在项目结果中,导出的低维坐标列名为 PC1PC2、…,对应 Transformed 工作表。

3.4 核特征值与项目内解释率

代码会从 KernelPCA 对象中读取 eigenvalues_(若不可用则尝试 lambdas_),并生成 Eigenvalues 表。项目内定义的解释率为

$$ \text{explained\_ratio}_r=\frac{\lambda_r}{\sum_{j}\lambda_j} \tag{13} $$

需要强调:这是基于核矩阵特征值计算的占比,不应机械等同于线性 PCA 中对原始数据总方差的解释率。

4. 逆变换与重构误差

4.1 逆变换开关

若勾选 fit_inverse=True,代码会在构造 KernelPCA 时设置

  1. fit_inverse_transform=True
  2. alpha=<用户设定值>

随后在完成 fit_transform 后调用 inverse_transform() 尝试重构特征。

4.2 重构误差 MSE

若逆变换成功,项目会计算重构均方误差:

$$ \mathrm{MSE}=\frac{1}{np}\sum_{i=1}^{n}\sum_{j=1}^{p}(x_{ij}-\hat x_{ij})^2 \tag{14} $$

其中 \(\hat x_{ij}\) 为重构值。代码中的实际口径是:

  1. 若做过标准化或归一化,则先把逆变换结果反变换回原始尺度,再与原始特征矩阵 \(X\) 计算 MSE;
  2. 若未做预处理,则直接在当前特征尺度上计算 MSE。

若逆变换失败,Reconstruction 工作表不会生成,reconstruction_mse 也可能保持为空。

5. 代码实现细节

5.1 n_components 的自动截断

fit() 中,若用户设定的输出维度大于样本数,则代码会自动修正为

$$ q\leftarrow \min(q,n) \tag{15} $$

并把修正后的值写回 parameters。也就是说,当前实现不会让 n_components 超过样本数。

5.2 gamma 的实际处理方式

界面中 gamma 允许留空。若留空,代码会把 gamma=None 直接传给 KernelPCA,即由 sklearn 的默认行为决定其取值;界面提示文案写为“默认按 1/(特征数)”,这是对默认行为的说明,而不是本项目手工写死的数值。

5.3 degreecoef0alpha

当前代码逻辑为:

  1. degree 主要用于 poly 核;
  2. coef0 用于 polysigmoid 核;
  3. alpha 仅在启用逆变换时参与重构的岭回归求解。

6. 算法流程

结合当前项目实现,KPCA-核主成分 的实际执行流程如下:

  1. 读取 .xlsx.xls.csv 文件;CSV 会依次尝试 utf-8-sigutf-8gbk 编码。
  2. 检查数据是否为空、是否至少包含 1 列样本标识和 1 列特征。
  3. 对第 2 列及以后执行数值性与空值校验;若发现常数列,只弹出提醒,不阻断流程。
  4. 在“特征选择”页勾选参与 KPCA 的特征列。
  5. 在“方法与参数”页设置 n_componentskernelgammadegreecoef0alphafit_inversenormalizationrandom_state
  6. normalization 选项对特征矩阵进行标准化、区间缩放或不处理。
  7. 调用 sklearn.decomposition.KernelPCA.fit_transform() 生成低维表示。
  8. 提取核特征值并计算项目内定义的 explained_ratio
  9. 若启用逆变换,则调用 inverse_transform() 重构特征并计算 MSE。
  10. 绘制降维散点图、特征值碎石图和解释率柱状图。
  11. 导出 Excel 结果文件 KPCA_results_<时间戳>.xlsx,并自动生成复现脚本。

7. 关键参数说明

7.1 n_components

输出维度,界面允许范围为 1 到 200,默认值为 2。当前实现会把它截断到不超过样本数。

7.2 kernel

当前支持:

  1. rbf
  2. poly
  3. linear
  4. sigmoid
  5. cosine

其中 rbf 更适合平滑非线性结构,poly 更适合多项式型非线性,linear 在一定程度上可视为退化到线性 PCA 场景。

7.3 gamma

核参数,允许留空。对 rbfpolysigmoid 等核函数通常较为敏感。值过大可能导致局部化过强,值过小则可能使非线性结构表达不足。

7.4 degree

多项式核的次数,默认值为 3。只有在 kernel="poly" 时才真正起作用。

7.5 coef0

常数项,默认值为 1.0,主要对 polysigmoid 核有效。

7.6 fit_inversealpha

  1. fit_inverse=True 时,程序会尝试执行逆变换并输出重构结果;
  2. alpha 是逆变换中岭回归的正则化系数,默认值为 1.0;
  3. 并不是所有核和参数组合都一定能稳定得到逆变换结果。

7.7 normalization

支持:

  1. none
  2. standard
  3. minmax

在不同特征量纲差异较大时,通常建议先做 standardminmax

7.8 random_state

可选整数,默认留空。代码会直接把该参数传给 KernelPCA,主要用于提升实验复现性。

8. 输出结果与导出说明

8.1 Excel 工作表

根据 save_to_excel() 的实现,导出的 Excel 文件包含:

  1. RawData
  2. Features
  3. Processed
  4. Transformed
  5. Eigenvalues
  6. Parameters
  7. 图表清单
  8. Reconstruction(仅在逆变换成功时存在)

其中:

  1. RawData 保存原始完整数据;
  2. Features 只保存被选中的原始特征列,不含首列样本 ID;
  3. Processed 保存预处理后的特征矩阵,并保留首列样本 ID;
  4. Transformed 保存降维后的 PC1PC2、…;
  5. Parameters 中会包含 reconstruction_mse

8.2 图表文件

当前代码可能输出以下图表到结果目录的 plots/ 子目录:

  1. embedding_scatter.pngembedding_scatter_1d.png
  2. eigenvalues_scree.png
  3. explained_ratio.png

其中:

  1. 当输出维度不少于 2 时,生成二维降维散点图;
  2. 当只输出 1 维时,生成单轴散点图;
  3. 图表路径会登记到 图表清单 工作表。

9. 论文写作建议

9.1 方法描述模板

“本文采用核主成分分析(KPCA)对高维特征进行非线性降维。首先根据变量量纲对原始特征进行标准化或区间缩放,然后选择适当的核函数构造样本间核矩阵,并在核特征空间内提取前若干个主成分作为低维表示。为评估降维结果,本文输出核特征值及其相对占比;在启用逆变换时,进一步计算重构均方误差,以衡量低维表示对原始特征的重建能力。”

9.2 结果解释模板

结果部分可写为:若前几个核特征值占比明显较高,说明主要非线性结构已集中在少数核主成分中。若二维散点图呈现出明显分离结构,可进一步结合分类、聚类或可视化分析解释样本分布;若启用逆变换后 reconstruction_mse 较小,则通常说明当前降维维度下仍保留了较多原始信息。

9.3 图表题注模板

  • 图 1 KPCA 降维散点图。
  • 图 2 KPCA 核特征值碎石图。
  • 图 3 KPCA 核主成分相对占比图。
  • 表 1 KPCA 核特征值及相对占比。
  • 表 2 KPCA 参数设置与重构误差结果。

10. 实现说明与注意事项

  1. KPCA 的结果对核函数和核参数较敏感,解释时应结合参数设置而不是只看图形。
  2. 本模块中的 explained_ratio 来自核特征值比例,不应直接类比为线性 PCA 的“原始方差解释率”。
  3. 常数列虽然不会阻断计算,但通常会削弱核矩阵的有效信息量,建议在分析前剔除。
  4. fit_inverse=True 并不保证一定成功得到重构结果;若逆变换失败,结果文件中不会有 Reconstruction 工作表。
  5. 当前代码把 random_state 直接传给 KernelPCA,但模型整体稳定性仍会受到核函数、样本规模和参数选择影响。

11. 单篇终审补充

11.1 图题与表题对齐建议

当前 KPCA 模块的真实工作簿包含:

  • RawData
  • Features
  • Processed
  • Transformed
  • Eigenvalues
  • Parameters
  • 图表清单
  • Reconstruction(仅在逆变换成功时存在)

其中 Transformed 是正文最适合引用的“核主成分得分表”,Eigenvalues 更适合作为附录或方法验证表。不要把 Features 误写成“预处理后数据”,因为当前实现单独导出了 Processed,两者含义并不相同。

图文件保存在结果目录的 plots/ 子目录,当前实现真实输出:

  • embedding_scatter.pngembedding_scatter_1d.png
  • eigenvalues_scree.png
  • explained_ratio.png

因此图题建议分别写成“KPCA 降维散点图”“KPCA 核特征值碎石图”“KPCA 核特征值相对占比图”。其中第一张图在一维场景下会退化为单轴散点图,但图义仍然是核主成分表示,不应改写成别的方法图名。

11.2 终审说明

这篇文档最需要避免的误写,是把 explained_ratio 直接等同于线性 PCA 的“原始方差解释率”。当前实现里的 explained_ratio.png 来自核特征值比例,它更适合表述为“核特征值相对占比”,而不是原空间方差贡献率。

另外,当前 repro 脚本已经采用 repro_inputs/... 相对路径,结果目录中可见如 repro_inputs/kpca_sample_1.xlsx 的输入副本引用。因此这篇在可复现性口径上可以按新框架写,但论文中不应把“相对路径复现”混写成“算法完全不依赖输入文件路径”。

11.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/KPCA-核主成分。由于该算法的 results/KPCA-核主成分_UIFlow_20260306_01 目录下混有多轮 UIFlow 输出,本次优先采用更干净的单轮结果目录 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658 做证据绑定。

该目录下主工作簿为 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/KPCA_results_20260322_024658.xlsx,实测工作表为:

  • RawData
  • Features
  • Processed
  • Transformed
  • Eigenvalues
  • Parameters
  • 图表清单
  • Reconstruction

Reconstruction 在这一轮真实存在,说明本轮逆变换成功并写入了重构结果;但这不代表所有 KPCA 参数组合都会生成该页,因为逆变换仍取决于 fit_inverse、核函数和样本条件。论文写作时可以引用这一轮的 Reconstruction,但不能把它写成所有运行必有的固定页。

该轮真实图文件为:

  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/plots/embedding_scatter.png
  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/plots/eigenvalues_scree.png
  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/plots/explained_ratio.png

这里的 explained_ratio.png 仍应表述为“核特征值相对占比图”,不要改写成线性 PCA 的方差贡献率图。

复现实物方面,该目录实际包含:

  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/repro_kpca_核主成分.py
  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/repro_inputs/kpca_sample.xlsx
  • 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658/repro_inputs/kpca_sample_1.xlsx

脚本中实际写的是 INPUT_FILE = 'repro_inputs/kpca_sample_1.xlsx',所以本轮复现入口绑定的是 kpca_sample_1.xlsx,不是同目录下的 kpca_sample.xlsx。两份输入副本可以同时保留,但论文或交付说明若要写“复现脚本使用的输入”,应按脚本真实值写到 repro_inputs/kpca_sample_1.xlsx

10. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/聚类与降维/KPCA-核主成分/results/KPCA-核主成分分析结果_20260322_024658
  • 正文应围绕 ParametersRawDataProcessedDataEmbeddedReconstructionKPCA_Stats图表清单 来写。
  • 图证应对应 embedding_scatter.pngeigenvalues_scree.pngexplained_ratio.png,并把核特征值和重构表述清楚。
  • 复现脚本应按 repro_kpca_核主成分.py + repro_inputs/kpca_sample_1.xlsx 的口径说明。