KPCA-核主成分
核主成分分析(Kernel PCA, KPCA)是在 PCA 基础上引入核技巧得到的非线性降维方法。它的核心思想是:先通过核函数把样本隐式映射到高维特征空间,再在该特征空间中执行类似 PCA 的特征分解,从而提取能够刻画非线性结构的低维表示。
KPCA-核主成分
1. 方法概述
核主成分分析(Kernel PCA, KPCA)是在 PCA 基础上引入核技巧得到的非线性降维方法。它的核心思想是:先通过核函数把样本隐式映射到高维特征空间,再在该特征空间中执行类似 PCA 的特征分解,从而提取能够刻画非线性结构的低维表示。
本项目中的 KPCA-核主成分 模块并不是自写核矩阵求解器,而是对 sklearn.decomposition.KernelPCA 的工程化封装。当前代码支持:
rbf、poly、linear、sigmoid、cosine五种核函数;none、standard、minmax三种特征预处理;- 可选的逆变换
fit_inverse_transform; - 可选输出重构误差
reconstruction_mse; - 输出核特征值、项目内定义的解释率、降维结果和图表。
设共有 \(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.py、indicators_widget.py 与 data_validator.py 的实现,模块对输入数据的真实要求如下:
- 数据不能为空;
- 至少包含两列,即第 1 列对象名称和至少 1 列特征;
- 第 2 列及以后必须为数值型;
- 特征列不能含空值;
- 至少选择 1 个特征用于 KPCA;
- 若存在常数列,程序会给出警告提示,但不会阻止继续计算。
其中第 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} $$
来间接刻画样本在高维空间中的相似性。当前项目暴露的核函数包括:
linearrbfpolysigmoidcosine
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} $$
在项目结果中,导出的低维坐标列名为 PC1、PC2、…,对应 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 时设置
fit_inverse_transform=Truealpha=<用户设定值>
随后在完成 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}\) 为重构值。代码中的实际口径是:
- 若做过标准化或归一化,则先把逆变换结果反变换回原始尺度,再与原始特征矩阵 \(X\) 计算 MSE;
- 若未做预处理,则直接在当前特征尺度上计算 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 degree、coef0 与 alpha
当前代码逻辑为:
degree主要用于poly核;coef0用于poly与sigmoid核;alpha仅在启用逆变换时参与重构的岭回归求解。
6. 算法流程
结合当前项目实现,KPCA-核主成分 的实际执行流程如下:
- 读取
.xlsx、.xls或.csv文件;CSV 会依次尝试utf-8-sig、utf-8、gbk编码。 - 检查数据是否为空、是否至少包含 1 列样本标识和 1 列特征。
- 对第 2 列及以后执行数值性与空值校验;若发现常数列,只弹出提醒,不阻断流程。
- 在“特征选择”页勾选参与 KPCA 的特征列。
- 在“方法与参数”页设置
n_components、kernel、gamma、degree、coef0、alpha、fit_inverse、normalization与random_state。 - 按
normalization选项对特征矩阵进行标准化、区间缩放或不处理。 - 调用
sklearn.decomposition.KernelPCA.fit_transform()生成低维表示。 - 提取核特征值并计算项目内定义的
explained_ratio。 - 若启用逆变换,则调用
inverse_transform()重构特征并计算 MSE。 - 绘制降维散点图、特征值碎石图和解释率柱状图。
- 导出 Excel 结果文件
KPCA_results_<时间戳>.xlsx,并自动生成复现脚本。
7. 关键参数说明
7.1 n_components
输出维度,界面允许范围为 1 到 200,默认值为 2。当前实现会把它截断到不超过样本数。
7.2 kernel
当前支持:
rbfpolylinearsigmoidcosine
其中 rbf 更适合平滑非线性结构,poly 更适合多项式型非线性,linear 在一定程度上可视为退化到线性 PCA 场景。
7.3 gamma
核参数,允许留空。对 rbf、poly、sigmoid 等核函数通常较为敏感。值过大可能导致局部化过强,值过小则可能使非线性结构表达不足。
7.4 degree
多项式核的次数,默认值为 3。只有在 kernel="poly" 时才真正起作用。
7.5 coef0
常数项,默认值为 1.0,主要对 poly 和 sigmoid 核有效。
7.6 fit_inverse 与 alpha
fit_inverse=True时,程序会尝试执行逆变换并输出重构结果;alpha是逆变换中岭回归的正则化系数,默认值为 1.0;- 并不是所有核和参数组合都一定能稳定得到逆变换结果。
7.7 normalization
支持:
nonestandardminmax
在不同特征量纲差异较大时,通常建议先做 standard 或 minmax。
7.8 random_state
可选整数,默认留空。代码会直接把该参数传给 KernelPCA,主要用于提升实验复现性。
8. 输出结果与导出说明
8.1 Excel 工作表
根据 save_to_excel() 的实现,导出的 Excel 文件包含:
RawDataFeaturesProcessedTransformedEigenvaluesParameters图表清单Reconstruction(仅在逆变换成功时存在)
其中:
RawData保存原始完整数据;Features只保存被选中的原始特征列,不含首列样本 ID;Processed保存预处理后的特征矩阵,并保留首列样本 ID;Transformed保存降维后的PC1、PC2、…;Parameters中会包含reconstruction_mse。
8.2 图表文件
当前代码可能输出以下图表到结果目录的 plots/ 子目录:
embedding_scatter.png或embedding_scatter_1d.pngeigenvalues_scree.pngexplained_ratio.png
其中:
- 当输出维度不少于 2 时,生成二维降维散点图;
- 当只输出 1 维时,生成单轴散点图;
- 图表路径会登记到
图表清单工作表。
9. 论文写作建议
9.1 方法描述模板
“本文采用核主成分分析(KPCA)对高维特征进行非线性降维。首先根据变量量纲对原始特征进行标准化或区间缩放,然后选择适当的核函数构造样本间核矩阵,并在核特征空间内提取前若干个主成分作为低维表示。为评估降维结果,本文输出核特征值及其相对占比;在启用逆变换时,进一步计算重构均方误差,以衡量低维表示对原始特征的重建能力。”
9.2 结果解释模板
结果部分可写为:若前几个核特征值占比明显较高,说明主要非线性结构已集中在少数核主成分中。若二维散点图呈现出明显分离结构,可进一步结合分类、聚类或可视化分析解释样本分布;若启用逆变换后 reconstruction_mse 较小,则通常说明当前降维维度下仍保留了较多原始信息。
9.3 图表题注模板
- 图 1 KPCA 降维散点图。
- 图 2 KPCA 核特征值碎石图。
- 图 3 KPCA 核主成分相对占比图。
- 表 1 KPCA 核特征值及相对占比。
- 表 2 KPCA 参数设置与重构误差结果。
10. 实现说明与注意事项
- KPCA 的结果对核函数和核参数较敏感,解释时应结合参数设置而不是只看图形。
- 本模块中的
explained_ratio来自核特征值比例,不应直接类比为线性 PCA 的“原始方差解释率”。 - 常数列虽然不会阻断计算,但通常会削弱核矩阵的有效信息量,建议在分析前剔除。
fit_inverse=True并不保证一定成功得到重构结果;若逆变换失败,结果文件中不会有Reconstruction工作表。- 当前代码把
random_state直接传给KernelPCA,但模型整体稳定性仍会受到核函数、样本规模和参数选择影响。
11. 单篇终审补充
11.1 图题与表题对齐建议
当前 KPCA 模块的真实工作簿包含:
RawDataFeaturesProcessedTransformedEigenvaluesParameters图表清单Reconstruction(仅在逆变换成功时存在)
其中 Transformed 是正文最适合引用的“核主成分得分表”,Eigenvalues 更适合作为附录或方法验证表。不要把 Features 误写成“预处理后数据”,因为当前实现单独导出了 Processed,两者含义并不相同。
图文件保存在结果目录的 plots/ 子目录,当前实现真实输出:
embedding_scatter.png或embedding_scatter_1d.pngeigenvalues_scree.pngexplained_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,实测工作表为:
RawDataFeaturesProcessedTransformedEigenvaluesParameters图表清单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。 - 正文应围绕
Parameters、RawData、ProcessedData、Embedded、Reconstruction、KPCA_Stats、图表清单来写。 - 图证应对应
embedding_scatter.png、eigenvalues_scree.png、explained_ratio.png,并把核特征值和重构表述清楚。 - 复现脚本应按
repro_kpca_核主成分.py + repro_inputs/kpca_sample_1.xlsx的口径说明。