基于 matlab实现KPCA核主成分分析 数据降维 注释清晰
1.用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征
2.直接替换excel数据即可用
3.附赠案例数据 可直接运行
文章目录
核主成分分析(Kernel Principal Component Analysis, KPCA)是一种非线性降维技术,它通过将数据映射到高维特征空间中,然后在该空间中执行传统的主成分分析(PCA)。KPCA能够捕捉数据中的非线性结构,从而提供更有效的降维。
下面是一个基于MATLAB实现KPCA的示例代码,并附有详细的注释,帮助你理解每一步的操作。
示例代码
function kpca_example()
% 加载或生成数据集
% 这里使用一个简单的二维数据集作为示例
rng(0); % 设置随机种子以确保结果可重复
data = generate_sample_data();
% 数据可视化
figure;
scatter(data(:,1), data(:,2));
title('Original Data');
xlabel('Feature 1');
ylabel('Feature 2');
% 设置KPCA参数
kernelType = 'rbf'; % 核函数类型:'linear', 'poly', 'rbf'
gamma = 1; % RBF核的参数,仅当kernelType为'rbf'时使用
numComponents = 2; % 要保留的主成分数量
% 执行KPCA
[transformedData, eigenvalues, eigenvectors] = kpca(data, kernelType, gamma, numComponents);
% 可视化降维后的数据
figure;
scatter(transformedData(:,1), transformedData(:,2));
title('Data after KPCA');
xlabel('Principal Component 1');
ylabel('Principal Component 2');
end
function data = generate_sample_data()
% 生成一个简单的二维数据集,包含两个螺旋形的数据簇
t = linspace(0, 4*pi, 100);
x1 = cos(t) + randn(size(t)) * 0.1;
y1 = sin(t) + randn(size(t)) * 0.1;
x2 = 0.8 * cos(t + pi) + randn(size(t)) * 0.1;
y2 = 0.8 * sin(t + pi) + randn(size(t)) * 0.1;
data = [x1, y1; x2, y2];
end
function [transformedData, eigenvalues, eigenvectors] = kpca(X, kernelType, gamma, numComponents)
% 计算核矩阵
n = size(X, 1);
K = compute_kernel_matrix(X, kernelType, gamma);
% 中心化核矩阵
one_n = ones(n) / n;
K_centered = K - one_n * K - K * one_n + one_n * K * one_n;
% 计算特征值和特征向量
[eigenvectors, eigenvalues] = eigs(K_centered, numComponents, 'lm'); % 只取最大特征值对应的特征向量
eigenvalues = diag(eigenvalues); % 将特征值转换为对角矩阵
% 归一化特征向量
for i = 1:numComponents
eigenvectors(:,i) = eigenvectors(:,i) / sqrt(eigenvalues(i));
end
% 将数据投影到新的特征空间
transformedData = K_centered * eigenvectors;
end
function K = compute_kernel_matrix(X, kernelType, gamma)
% 计算核矩阵
n = size(X, 1);
K = zeros(n);
switch kernelType
case 'linear'
K = X * X';
case 'poly'
d = 3; % 多项式核的阶数
K = (X * X' + 1).^d;
case 'rbf'
for i = 1:n
for j = 1:n
diff = X(i,:) - X(j,:);
K(i,j) = exp(-gamma * sum(diff.^2));
end
end
otherwise
error('Unsupported kernel type');
end
end
代码解释
主函数 kpca_example
- 加载或生成数据集:
generate_sample_data
函数生成一个简单的二维数据集,包含两个螺旋形的数据簇。 - 数据可视化:使用
scatter
函数绘制原始数据。 - 设置KPCA参数:选择核函数类型(线性、多项式、RBF),并设置相关参数。
- 执行KPCA:调用
kpca
函数进行核主成分分析。 - 可视化降维后的数据:使用
scatter
函数绘制降维后的数据。
数据生成函数 generate_sample_data
- 生成一个简单的二维数据集,包含两个螺旋形的数据簇,用于演示KPCA的效果。
核主成分分析函数 kpca
- 计算核矩阵:根据选择的核函数类型(线性、多项式、RBF)计算核矩阵。
- 中心化核矩阵:对核矩阵进行中心化处理,使其均值为零。
- 计算特征值和特征向量:使用
eigs
函数计算核矩阵的最大特征值及其对应的特征向量。 - 归一化特征向量:将特征向量归一化。
- 将数据投影到新的特征空间:将原始数据投影到新的特征空间,得到降维后的数据。
核矩阵计算函数 compute_kernel_matrix
- 根据选择的核函数类型(线性、多项式、RBF)计算核矩阵。对于RBF核,需要指定参数
gamma
。
注意事项
- 核函数的选择:不同的核函数适用于不同类型的数据。RBF核通常适用于非线性数据,而线性核适用于线性数据。
- 参数调整:核函数的参数(如RBF核的
gamma
参数)需要根据具体数据进行调整,以获得最佳效果。 - 特征选择:在实际应用中,可以根据特征值的大小选择保留的主成分数量,以达到降维的目的。
这个示例代码提供了一个基本框架,你可以根据具体需求进一步优化和扩展。希望这能帮助你理解如何在MATLAB中实现KPCA进行数据降维。