KPCA 的 Matlab 实现:分离训练与测试流程
在机器学习和数据预处理中,降维是一项关键任务。主成分分析(PCA)因其简洁高效被广泛应用,而面对非线性结构的数据时,核主成分分析(KPCA)则展现出更强的表达能力。KPCA 利用核方法将原始数据映射至高维特征空间,并在此空间中执行线性 PCA,从而捕捉数据中的非线性模式。本文介绍如何使用 Matlab 实现 KPCA,并明确划分训练(train)和测试(test)两个阶段,代码注释清晰,逻辑分明。
实现原理概述
KPCA 的主要步骤包括:
- 根据选定的核函数构建训练集的核矩阵;
- 对核矩阵进行中心化处理;
- 求解中心化后核矩阵的特征值与特征向量;
- 按特征值大小排序并选取前 k 个主成分;
- 利用训练得到的投影方向,将新样本映射到低维空间。
其中,训练过程用于建立模型,提取主成分方向;测试过程则基于已训练好的模型对新的未知数据进行降维,确保模型具有泛化能力。
训练阶段代码实现
训练函数的核心是生成核矩阵并完成其在特征空间中的主成分提取。以下为训练部分的主要流程:
function [eigenvectors, eigenvalues, centered_kernel] = kpca_train(data, kernel_type, kernel_param, num_components)
% data: 训练数据集,每一行是一个样本
% kernel_type: 核函数类型,例如 'gaussian'
% kernel_param: 核函数参数,对于高斯核就是sigma
% num_components: 要保留的主成分数量
% 计算核矩阵
if strcmp(kernel_type, 'gaussian')
kernel_matrix = gaussian_kernel(data, data, kernel_param);
else
error('Unsupported kernel type');
end
% 核矩阵中心化
n = size(data, 1);
one_n = ones(n, n) / n;
centered_kernel = kernel_matrix - one_n * kernel_matrix - kernel_matrix * one_n + one_n * kernel_matrix * one_n;
% 计算特征值和特征向量
[eigenvectors, eigenvalues] = eig(centered_kernel);
eigenvalues = diag(eigenvalues);
[~, idx] = sort(eigenvalues, 'descend');
eigenvalues = eigenvalues(idx);
eigenvectors = eigenvectors(:, idx);
% 选择主成分
eigenvectors = eigenvectors(:, 1:num_components);
eigenvalues = eigenvalues(1:num_components);
end
function kernel_matrix = gaussian_kernel(X, Y, sigma)
% X, Y: 数据集,每一行是一个样本
% sigma: 高斯核参数
n = size(X, 1);
m = size(Y, 1);
kernel_matrix = zeros(n, m);
for i = 1:n
for j = 1:m
kernel_matrix(i, j) = exp(-norm(X(i, :) - Y(j, :))^2 / (2 * sigma^2));
end
end
end
函数 kpca_train 首先调用指定类型的核函数计算训练数据之间的相似性,示例中采用高斯核函数(RBF),该部分实现在如下子函数中定义:
gaussian
kernel
随后,程序对核矩阵进行中心化操作,这是保证后续特征分解有效性的必要步骤。接着,通过特征值分解获取投影方向,并按照特征值从大到小排序,保留前 个最大特征值对应的特征向量作为主成分,最终输出可用于测试阶段的模型参数。num_components
测试阶段代码实现
测试阶段的目标是将新的测试样本映射到由训练集构建的低维特征空间中。其实现依赖于训练阶段保存的信息,如中心化矩阵、特征向量及支持向量等。
function projected_data = kpca_test(test_data, eigenvectors, centered_kernel_train, train_data, kernel_type, kernel_param)
% test_data: 测试数据集,每一行是一个样本
% eigenvectors: 训练得到的特征向量
% centered_kernel_train: 训练数据的中心化核矩阵
% train_data: 训练数据集
% kernel_type: 核函数类型
% kernel_param: 核函数参数
% 计算测试数据与训练数据的核矩阵
if strcmp(kernel_type, 'gaussian')
kernel_matrix_test = gaussian_kernel(test_data, train_data, kernel_param);
else
error('Unsupported kernel type');
end
% 对测试数据的核矩阵进行中心化
n_test = size(test_data, 1);
n_train = size(train_data, 1);
one_n_train = ones(n_test, n_train) / n_train;
centered_kernel_test = kernel_matrix_test - one_n_train * centered_kernel_train;
% 将测试数据投影到主成分上
projected_data = centered_kernel_test * eigenvectors;
end
在测试函数 kpca_test 中,首先计算测试数据与训练数据之间的核矩阵,依然使用相同的高斯核函数:
kpca_test
然后对该核矩阵进行中心化处理,注意此处的中心化需参考训练集的均值位置,因此公式不同于训练阶段。最后,将中心化后的核矩阵与训练所得的特征向量相乘,即可获得测试样本在主成分方向上的投影,完成非线性降维。
总结
通过将 KPCA 的实现划分为独立的训练与测试模块,不仅提升了代码的可读性和复用性,也更贴近实际应用场景——即模型先在训练集上学习结构,再应用于新数据。整个流程结构清晰,便于调试与扩展。希望本内容能帮助你更好地理解 KPCA 在 Matlab 中的具体实现方式。



雷达卡


京公网安备 11010802022788号







