核主成分分析(KPCA)的原理及matlab代码实现
·
核主成分分析(KPCA)原理
核主成分分析是传统PCA的非线性扩展,通过核技巧将数据映射到高维特征空间,再在特征空间中进行线性PCA。其核心思想是利用核函数隐式计算高维空间中的内积,避免显式映射。
设原始数据为 $X = [x_1, x_2, ..., x_n] \in \mathbb{R}^{d \times n}$,通过非线性映射 $\phi$ 将数据映射到特征空间 $F$。在特征空间中,协方差矩阵为:
$$ C = \frac{1}{n} \sum_{i=1}^n \phi(x_i)\phi(x_i)^T $$
特征向量 $v$ 满足 $Cv = \lambda v$,可证明所有解 $v$ 位于 $\phi(x_i)$ 张成的空间中,即 $v = \sum_{i=1}^n \alpha_i \phi(x_i)$。通过核矩阵 $K_{ij} = k(x_i, x_j) = \langle \phi(x_i), \phi(x_j) \rangle$ 求解特征值问题:
$$ n \lambda \alpha = K \alpha $$
选择前 $k$ 个最大特征值对应的特征向量,归一化条件为 $\lambda_k \langle \alpha_k, \alpha_k \rangle = 1$。
MATLAB代码实现
function [K, eigVector, eigValue] = kpca(X, kernel, param, k)
% X: d x n 数据矩阵
% kernel: 核函数类型 ('gaussian', 'poly', 'linear')
% param: 核参数
% k: 保留的主成分数量
[n, d] = size(X);
X = X'; % 转换为d x n
% 计算核矩阵
K = zeros(n, n);
for i = 1:n
for j = 1:n
switch kernel
case 'gaussian'
K(i,j) = exp(-norm(X(:,i)-X(:,j))^2/(2*param^2));
case 'poly'
K(i,j) = (X(:,i)'*X(:,j) + 1)^param;
case 'linear'
K(i,j) = X(:,i)'*X(:,j);
end
end
end
% 中心化核矩阵
oneN = ones(n,n)/n;
K = K - oneN*K - K*oneN + oneN*K*oneN;
% 特征分解
[eigVector, eigValue] = eig(K);
eigValue = diag(eigValue);
[eigValue, idx] = sort(eigValue, 'descend');
eigVector = eigVector(:, idx);
% 归一化特征向量
for i = 1:size(eigVector,2)
eigVector(:,i) = eigVector(:,i)/sqrt(eigValue(i));
end
% 选择前k个主成分
if nargin > 3
eigVector = eigVector(:,1:k);
eigValue = eigValue(1:k);
end
% 计算投影数据
projected = K * eigVector;
end
使用示例
% 生成环形数据
theta = 2*pi*rand(300,1);
r = 5 + rand(300,1);
X = [r.*cos(theta), r.*sin(theta)];
% 执行KPCA
[K, eigVector, eigValue] = kpca(X, 'gaussian', 1.5, 2);
% 可视化结果
figure;
scatter(X(:,1), X(:,2));
title('Original Data');
figure;
scatter(K(:,1), K(:,2));
title('KPCA Projection');
注意事项
-
核函数选择影响结果:高斯核适用于复杂非线性结构,多项式核适合多项式关系,线性核退化为标准PCA。
-
参数调整:高斯核的带宽参数需要通过交叉验证等方法确定。
-
计算复杂度:核矩阵大小为n×n,当样本量大时计算成本高,可考虑近似方法。
-
数据预处理:建议在KPCA前对数据进行标准化处理。
-
特征值解释:特征值大小反映对应主成分的方差贡献度。
更多推荐


所有评论(0)