适用平台:Matlab2021及以上
什么是数据降维: 数据降维是指将高维度的数据映射到低维度的空间中,同时保留数据中的重要信息。这种降维的操作可以帮助我们更好地理解和处理数据,并且可以降低计算的复杂度,提高机器学习算法的效率和准确率。

降维方法:PCA和KPCA都是降维技术,用于从高维数据中提取主要特征或进行非线性降维。下面将详细说明它们的原理和区别(附带程序结果)。
主成分分析
(Principal Component Analysis,PCA)
PCA是一种降维技术,其目标是从给定的特征中生成新的特征,而不仅仅是挑选已有的特征。这些新的特征,称为主成分,是原始特征的线性组合。这样,PCA通过将数据投影到具有最大方差的方向上,来实现降维。
在PCA中,主成分是按照它们所捕获的方差的降序排列的。选择前几个主成分就可以实现降维,因为这些主成分包含了原始数据中大部分的方差信息。通过舍弃方差较小的主成分,可以实现数据的降维,同时尽可能保留原始数据的信息。
计算步骤:
- 数据中心化: 首先,对数据进行中心化操作,不改变原始样本的布局,即将每个特征的均值减去相应特征的均值,使数据的均值为零,这有助于消除原始数据的平移影响。

- 协方差矩阵: PCA的核心思想是通过计算协方差矩阵,找到数据中的主成分,即数据中方差最大的方向。
- 特征值和特征向量: 对协方差矩阵进行特征值分解,得到特征值和特征向量。特征向量构成了主成分,而特征值表示数据在这些主成分方向上的方差。
- 降维: 选择特征值较大的特征向量,对应的维度即为主成分,可以将数据投影到这些主成分上,实现降维。
特点:
- 线性降维:PCA是一种线性降维方法,只能捕捉数据中的线性结构。
- 全局性:PCA通过考虑整体方差来选择主成分,因此可能无法很好地捕捉局部的非线性结构。
核主成分分析
(Kernel Principal Component Analysis,KPCA)
PCA是线性的,对于包含非线性结构的数据,效果可能不佳。KPCA引入了核技巧,该技巧允许在高维空间中进行非线性映射,而无需显式计算高维空间中的数据点。核技巧的基本思想是通过核函数(如多项式核或高斯核)计算原始特征空间中的点对之间的相似度,然后将这些相似度用作在高维空间中执行PCA的基础。
计算步骤:
- 非线性映射: 通过核技巧,KPCA将原始数据映射到一个高维的特征空间,使得在这个空间中数据的非线性结构变得线性可分。这使得在高维空间中进行PCA成为可能。
- 主成分提取: 在高维空间中,KPCA通过找到数据中的主成分来完成降维。这些主成分对应于高维空间中的方差最大的方向。
- 降维: KPCA将数据映射到高维空间,然后选择其中最重要的主成分,从而实现了在原始数据空间中的降维效果。这有助于保留数据中的非线性结构。
特点:
- 非线性映射:KPCA能够处理包含非线性结构的数据,使得在高维空间中进行线性分析成为可能。这对于一些实际问题,如图像识别和模式识别,非常有用。
- 保留非线性结构:与传统PCA相比,KPCA更能够保留数据中的非线性结构,因此在处理非线性问题时通常能够提供更好的性能。
- 核函数的选择:KPCA的性能很大程度上取决于选择的核函数。不同的核函数适用于不同类型的数据,因此在应用KPCA时需要仔细选择适当的核函数。
- 计算复杂度:由于涉及高维空间的计算,KPCA的计算复杂度相对较高。这可能在处理大规模数据集时成为一个挑战。
总结:如果数据具有明显的线性结构,PCA可能足够。但如果数据包含复杂的非线性结构,或者需要更好地捕捉局部信息,那么KPCA可能更为合适。
为了便于新手小白上手,本程序还支持将特征值、贡献率以及
- PCA降维后的数据
- KPCA降维后的数据
写进了Excel表中,方便大家查阅。
部分程序:% 特征值排序 % 来自公众号《创新优化及预测代码》
[sortedEigenvalues, idx] = sort(diag(D), 'descend');
%% 提取前5个主成分
numComponents = 5;
topComponents = V(:, idx(1:numComponents));
% 通过PCA降维
reducedData = centeredData * topComponents;
% 计算每个主成分的贡献率
contributionRatio = sortedEigenvalues / sum(sortedEigenvalues);
% 计算累积贡献率
cumulativeContribution = cumsum(contributionRatio);
%% 记录数据
% 将特征值、贡献率和累积贡献率写入Excel文件 % 来自公众号《创新优化及预测代码》
xlswrite('PCA降维后的数据.xlsx', reducedData, 'Sheet1');
xlswrite('主成分的特征值.xlsx', sortedEigenvalues(1:numComponents), 'Sheet1');
xlswrite('主成分的贡献率.xlsx', contributionRatio(1:numComponents), 'Sheet1');
xlswrite('主成分的累计贡献率.xlsx', cumulativeContribution(1:numComponents), 'Sheet1');
% 来自公众号《创新优化及预测代码》