主成分分析(PCA)是一种常用于降维和特征提取的机器学习技术。它的主要目标是通过线性变换将原始数据转换为一组新的、彼此不相关的变量,这些新变量被称为主成分。这些主成分按照方差的大小递减排列,因此,通过保留前几个主成分,你可以实现对数据的有效降维,同时最大程度地保留原始数据的信息。在实践中,主成分分析通过计算数据的协方差矩阵来确定数据中的主要方向。然后,通过对协方差矩阵进行特征值分解,得到主成分和对应的特征值。特征值表示主成分的重要性,越大的特征值对应的主成分在保留数据信息方面的贡献越大。
一、特征约减
特征维度约减是指通过某种方法减少数据集中特征的数量,同时保留数据集的关键信息。这有助于降低计算复杂性、提高模型的泛化能力,并减少过拟合的风险。在机器学习中,特征维度约减是一个重要的概念,特别是当处理高维数据时。高维数据往往包含大量的特征,但其中许多特征可能是冗余的或者对任务并不贡献太多信息。
典型的高维数据包括许多领域中的数据集,其中特征的数量远远大于样本的数量。一些常见的高维数据集包括:
-
生物信息学: 基因表达数据、蛋白质结构数据等。例如,在基因表达分析中,每个基因可以被看作一个特征,而样本是不同的生物条件。
-
图像处理: 图像通常由像素组成,每个像素可以看作一个特征。高分辨率图像的维度可以非常高,尤其是在三维图像处理中。
-
文本数据: 在自然语言处理中,文本数据通常以词袋模型表示,每个词是一个特征。对于大型文本语料库,特征维度可能会非常高。
-
社交网络数据: 在社交网络分析中,每个节点和边都可以被视为一个特征。对于大型社交网络,特征的数量可能很庞大。
-
遥感数据: 卫星或无人机收集的遥感数据通常包含多个波段的信息,每个波段可以被看作一个特征。
-
金融数据: 在金融领域,可能有大量的时间序列数据和其他市场指标,导致高维数据。
二、为何要维度约减?
维度约减是为了处理高维数据时面临的一系列挑战,并具有多方面的优势:
-
计算效率: 高维数据会导致计算和存储开销大幅增加。维度越高,模型的复杂性和计算复杂性都会增加,而维度约减可以显著提高算法的训练和推理速度。
-
防止维度灾难: 在高维空间中,样本稀疏性增加,导致模型更容易过拟合训练数据而在新数据上表现较差。通过维度约减,可以减轻维度灾难带来的泛化问题,提高模型的泛化能力。
-
提高模型解释性: 减少特征数量可以使模型更易于解释。在一些应用中,理解模型的决策过程是至关重要的,而维度约减有助于简化模型,使其更具可解释性。
-
防止过拟合: 高维数据中,模型可能更容易过拟合训练数据,表现在训练集上效果良好但在测试集上效果差。维度约减有助于剔除冗余信息,减小模型的复杂性,降低过拟合风险。
-
去除冗余信息: 数据中可能存在冗余或高度相关的特征,它们并不都对任务有贡献。通过维度约减,可以剔除这些冗余信息,提高模型的效果。
-
加速模型训练: 维度较高的数据通常需要更长的训练时间。通过简化模型,可以加速模型的训练过程,这对于调整超参数、迭代模型设计以及进行实时决策的应用都是至关重要的。
维度约减在各个领域都发挥着关键作用。在图像处理中,它用于提取关键特征,帮助对象识别和图像检索。在自然语言处理中,通过降维可以更好地理解文本数据,用于关键词提取、主题建模等任务。生物信息学中,维度约减用于分析基因表达模式和识别生物标记物。金融领域利用维度约减处理高维时间序列数据,改善预测和风险管理。医学影像学中,它有助于从高维影像数据中提取关键特征,促进疾病诊断和治疗规划。社交网络分析、物联网、客户关系管理等领域也广泛应用维度约减,以简化问题、提高效率,并在复杂的高维数据中发现关键信息。这些应用共同突显了维度约减在处理大规模、高维度数据时的不可或缺性,为数据分析和模型应用提供了重要支持。
三、常规维度约减方法
常规的维度约减方法可以根据其监督性质分为无监督、监督和半监督方法:
-
无监督维度约减方法:
- 主成分分析(PCA): 通过线性变换将高维数据映射到低维空间,保留数据中的主要方差。
- t-分布邻域嵌入(t-SNE): 非线性降维方法,用于在低维空间中保持高维数据点之间的局部关系。
- 自编码器(Autoencoder): 通过神经网络学习数据的紧凑表示,将高维数据映射到低维空间。
-
监督维度约减方法:
- 线性判别分析(LDA): 有监督的降维方法,通过最大化类别间距和最小化类别内方差,将数据映射到低维空间。
- 局部线性嵌入(LLE): 在保持邻域内数据点关系的同时,实现非线性的监督降维。
-
半监督维度约减方法:
- 半监督主成分分析(Semisupervised PCA): 结合PCA和半监督学习,允许使用标记和未标记的数据来进行维度约减。
- 半监督学习的自编码器: 结合自编码器和半监督学习思想,利用标记和未标记数据进行特征学习。
四、PCA
PCA的基本思路是通过找到数据中方差最大的方向,将数据映射到这个方向上,从而实现维度的降低。这个方向被称为第一主成分。接着,找到与第一主成分正交且方差次大的方向,这就是第二主成分。通过不断重复这个过程,我们可以找到一组主成分,它们捕捉了数据中的主要变化,同时降低了维度。这些主成分是原始特征的线性组合。PCA的目标是通过最大化方差,找到数据中最重要的方向,以实现有效的降维。
主成分可以通过协方差矩阵的特征值和特征向量来定义。给定一个包含n个样本和p个特征的数据矩阵X(其中每行是一个样本,每列是一个特征),协方差矩阵记作C。协方差矩阵的特征值(eigenvalues)和特征向量(eigenvectors)满足以下方程:
其中,λi 是第i个特征值,vi 是对应的第i个特征向量。这表示在特征向量方向上的变化由特征值表示。
主成分就是协方差矩阵的特征向量,它们描述了数据中方差最大的方向。这些特征向量通常按照对应的特征值的大小进行排序,从而确定主成分的重要性。第一主成分对应着最大的特征值,第二主成分对应着第二大的特征值,以此类推。
通过选择前k个主成分,我们可以将数据映射到一个k维的子空间,实现维度的约减。这个子空间由选定的主成分张成,从而最大程度地保留了原始数据的方差。
考虑某一原始特征,其中心化后的值变为。假设我们要沿某一基准向量 的方向进行投影。由于是基准向量,其模为1,即 。设两个向量之间的夹角为 ,那么其投影后的向量可以表示为 ,其中投影前的两个向量的内积为 。因此,投影后的向量可以表达为两个向量的内积。
为了使投影方差最大,即使全局投影后的方差最大,我们要考虑全局投影后的方差。投影后全量的均值为:
这个表达式中, 表示了投影后的全量均值,我们的目标是通过选择合适的 使得这个均值达到最大。
我们的目标是使投影方差最大,即全局投影后的方差达到最大。投影后的全量均值可表示为:
因此,投影后的方差为:
其中 就是中心化后矩阵的协方差矩阵,我们设其为。因此,可以得到:
这变成了一个带有约束的优化问题,我们将其转化为拉格朗日形式:
对 求偏导令其等于0得:
因此,可得:
这里的 就可以等同于协方差矩阵的特征值,为对应的特征向量。
将其带入 可得:
由于 是一个实数,因此可以得到:
因此,在进行降维时,我们优先选择特征值较大的特征向量。
五、PCA 的核方法
主成分分析(PCA)的核方法是一种通过使用核函数来进行非线性降维的扩展。在传统PCA中,我们使用线性变换来找到数据中的主要方差方向,但是对于非线性关系,线性PCA的效果可能不佳。核PCA通过引入核函数,允许在高维特征空间中进行非线性映射,从而更好地捕捉数据中的非线性结构。
以下是核PCA的基本思想和步骤:
-
选择核函数: 核函数是核PCA的关键。常用的核函数包括多项式核、高斯核(径向基函数核)等。核函数定义了数据在高维空间中的内积,使得非线性关系得以表示。
-
构建核矩阵: 使用选择的核函数计算每对样本之间的相似度,构建核矩阵(Gram矩阵)。核矩阵的元素 表示样本 i 和样本 j 之间的相似度。
-
中心化核矩阵: 将核矩阵进行中心化,确保样本在高维空间中的均值为零。
-
特征值分解: 对中心化的核矩阵进行特征值分解。得到的特征值和特征向量对应着非线性映射后的主成分。
-
选择主成分: 选择对应最大特征值的特征向量作为第一主成分,依次选择后续主成分。
-
投影: 将数据投影到选定的主成分上,完成降维。
核PCA的优势在于它能够处理非线性关系,从而更灵活地适应复杂的数据结构。然而,核PCA也有一些挑战,如选择合适的核函数和调整相关参数的问题。此外,计算复杂性也随着高维映射的引入而增加。
核PCA方法的优点在于,与线性PCA类似,主成分对应的较大特征值越重要,能够有效对非线性点云进行降维。然而,其缺点在于核数据矩阵 的维度为 ,其中 是样本数量。因此,当样本数量较大时,进行特征值分解变得困难,导致核PCA难以适应大数据。计算样本在主方向上的分量的计算量与样本数量成正比,因此在样本数量较多时,计算效率较低,而特征向量 的尺寸为 ,导致在样本数量较多时存储量庞大。
为了在非线性点云中获得良好的主方向提取效果,必须对样本空间进行足够密集的采样,以确保采样到的点云能够近似表示构成完整高维曲面形状的点云。如果密度不足,曲面可能会出现许多“大洞”,这些“大洞”处的样本性质不可能由大洞附近的样本推断出来。由于点云代表曲面,处于“大洞”处的点云性质可能与最接近的点云有很大差异。为什么不采集足够密集的样本呢?然而,这将面临“维数灾难”!假设样本空间的维度为,分布在单位立方体内,每维均匀等间隔采样,间隔为 ,则总样本数为。当 很大时,例如最常见的图像、语言、语音等,其维度假设最小在100左右,实际上可能远大于100。当 时,需要的样本数,这比宇宙中基本粒子的总数 还多!实际上,任何涉及非线性的机器学习算法都需要密集采样,都会遇到“维数灾难”问题,只是有些算法更聪明,能够更好地根据附近点云预测大洞处的点云。在这种情况下,我们称算法具有更好的泛化性能,泛化性能是指算法预测大洞处点云的能力,或者说举一反三的能力。泛化性能优越的算法能够降低采样密度。
六、案例
这段代码主要通过线性判别分析(Linear Discriminant Analysis,LDA)对鸢尾花数据集进行降维,然后使用主成分分析(Principal Component Analysis,PCA)计算主成分的解释方差比例,并进行可视化展示。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy as np
# 初始化线性判别分析对象
lda = LinearDiscriminantAnalysis(n_components=2)
# 载入鸢尾花数据集
iris_data = load_iris()
X, y = iris_data.data, iris_data.target
target_names = iris_data.target_names
# 标签字典,将数字标签映射为花的种类
label_dict = {i: k for i, k in enumerate(target_names)}
# 绘制散点图的函数
def plot_scatter(X, y, title, x_label, y_label):
fig, ax = plt.subplots()
for label, marker, color in zip(range(3), ('^', 's', 'o'), ('blue', 'red', 'green')):
ax.scatter(X[:, 0].real[y == label],
X[:, 1].real[y == label],
color=color,
alpha=0.5,
label=label_dict[label]
)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
ax.legend(loc='upper right', fancybox=True)
ax.set_title(title)
plt.show()
# 绘制原始鸢尾花数据的散点图
# plot_scatter(X, y, "原始鸢尾花数据", "花萼长度(厘米)", "花萼宽度(厘米)")
# 计算特征的均值向量
mean_vector = X.mean(axis=0)
print(mean_vector)
# 计算协方差矩阵
covariance_matrix = np.cov(X.T)
print(covariance_matrix.shape)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
# 打印特征向量和特征值
for i in range(len(eigenvalues)):
eigenvector = eigenvectors[:, i]
print('特征向量 {}:\n{}'.format(i + 1, eigenvector))
print('来自协方差矩阵的特征值 {}:{}'.format(i + 1, eigenvalues[i]))
print(30 * '*')
# 计算总方差
total_variance = eigenvalues.sum()
explained_variance_ratio = eigenvalues / total_variance
print('总方差:{}'.format(total_variance))
print('每个主成分的解释方差比例:', explained_variance_ratio)
# 绘制碎石图
plt.plot(np.cumsum(explained_variance_ratio))
plt.title('碎石图')
plt.xlabel('主成分(k)')
plt.ylabel('累计解释方差比例 <= k')
plt.show()
七、总结
在本次PCA学习实验中,我深入了解了主成分分析的原理和应用。通过学习PCA的基本概念,我理解了如何通过线性变换将原始数据映射到新的坐标系,以识别数据中的主要特征。实验中,我通过数学计算掌握了协方差矩阵、特征值和特征向量的重要性,为理解PCA的数学基础奠定了基础。在实际操作中,我按照PCA的步骤进行数据降维,从数据标准化开始,逐步计算协方差矩阵,通过特征值分解获得主成分,并选择保留的主成分数量。通过这一过程,我成功地将数据降维到所需的维度,同时最大程度地保留了信息。实验中,我也发现了PCA在数据可视化和噪声过滤方面的优势。通过绘制散点图,我清晰地观察到数据在新坐标系中的分布情况,有助于更好地理解数据结构。此外,通过排除主成分对应的小特征值,我成功过滤了数据中的噪声,提高了分析的准确性。