机器学习笔记(八)

        主成分分析(PCA)是一种常用于降维和特征提取的机器学习技术。它的主要目标是通过线性变换将原始数据转换为一组新的、彼此不相关的变量,这些新变量被称为主成分。这些主成分按照方差的大小递减排列,因此,通过保留前几个主成分,你可以实现对数据的有效降维,同时最大程度地保留原始数据的信息。在实践中,主成分分析通过计算数据的协方差矩阵来确定数据中的主要方向。然后,通过对协方差矩阵进行特征值分解,得到主成分和对应的特征值。特征值表示主成分的重要性,越大的特征值对应的主成分在保留数据信息方面的贡献越大。

一、特征约减

        特征维度约减是指通过某种方法减少数据集中特征的数量,同时保留数据集的关键信息。这有助于降低计算复杂性、提高模型的泛化能力,并减少过拟合的风险。在机器学习中,特征维度约减是一个重要的概念,特别是当处理高维数据时。高维数据往往包含大量的特征,但其中许多特征可能是冗余的或者对任务并不贡献太多信息。

        典型的高维数据包括许多领域中的数据集,其中特征的数量远远大于样本的数量。一些常见的高维数据集包括:

  1. 生物信息学: 基因表达数据、蛋白质结构数据等。例如,在基因表达分析中,每个基因可以被看作一个特征,而样本是不同的生物条件。

  2. 图像处理: 图像通常由像素组成,每个像素可以看作一个特征。高分辨率图像的维度可以非常高,尤其是在三维图像处理中。

  3. 文本数据: 在自然语言处理中,文本数据通常以词袋模型表示,每个词是一个特征。对于大型文本语料库,特征维度可能会非常高。

  4. 社交网络数据: 在社交网络分析中,每个节点和边都可以被视为一个特征。对于大型社交网络,特征的数量可能很庞大。

  5. 遥感数据: 卫星或无人机收集的遥感数据通常包含多个波段的信息,每个波段可以被看作一个特征。

  6. 金融数据: 在金融领域,可能有大量的时间序列数据和其他市场指标,导致高维数据。

二、为何要维度约减?

维度约减是为了处理高维数据时面临的一系列挑战,并具有多方面的优势:

  1. 计算效率: 高维数据会导致计算和存储开销大幅增加。维度越高,模型的复杂性和计算复杂性都会增加,而维度约减可以显著提高算法的训练和推理速度。

  2. 防止维度灾难: 在高维空间中,样本稀疏性增加,导致模型更容易过拟合训练数据而在新数据上表现较差。通过维度约减,可以减轻维度灾难带来的泛化问题,提高模型的泛化能力。

  3. 提高模型解释性: 减少特征数量可以使模型更易于解释。在一些应用中,理解模型的决策过程是至关重要的,而维度约减有助于简化模型,使其更具可解释性。

  4. 防止过拟合: 高维数据中,模型可能更容易过拟合训练数据,表现在训练集上效果良好但在测试集上效果差。维度约减有助于剔除冗余信息,减小模型的复杂性,降低过拟合风险。

  5. 去除冗余信息: 数据中可能存在冗余或高度相关的特征,它们并不都对任务有贡献。通过维度约减,可以剔除这些冗余信息,提高模型的效果。

  6. 加速模型训练: 维度较高的数据通常需要更长的训练时间。通过简化模型,可以加速模型的训练过程,这对于调整超参数、迭代模型设计以及进行实时决策的应用都是至关重要的。

维度约减在各个领域都发挥着关键作用。在图像处理中,它用于提取关键特征,帮助对象识别和图像检索。在自然语言处理中,通过降维可以更好地理解文本数据,用于关键词提取、主题建模等任务。生物信息学中,维度约减用于分析基因表达模式和识别生物标记物。金融领域利用维度约减处理高维时间序列数据,改善预测和风险管理。医学影像学中,它有助于从高维影像数据中提取关键特征,促进疾病诊断和治疗规划。社交网络分析、物联网、客户关系管理等领域也广泛应用维度约减,以简化问题、提高效率,并在复杂的高维数据中发现关键信息。这些应用共同突显了维度约减在处理大规模、高维度数据时的不可或缺性,为数据分析和模型应用提供了重要支持。

三、常规维度约减方法

常规的维度约减方法可以根据其监督性质分为无监督、监督和半监督方法:

  1. 无监督维度约减方法:

    • 主成分分析(PCA): 通过线性变换将高维数据映射到低维空间,保留数据中的主要方差。
    • t-分布邻域嵌入(t-SNE): 非线性降维方法,用于在低维空间中保持高维数据点之间的局部关系。
    • 自编码器(Autoencoder): 通过神经网络学习数据的紧凑表示,将高维数据映射到低维空间。
  2. 监督维度约减方法:

    • 线性判别分析(LDA): 有监督的降维方法,通过最大化类别间距和最小化类别内方差,将数据映射到低维空间。
    • 局部线性嵌入(LLE): 在保持邻域内数据点关系的同时,实现非线性的监督降维。
  3. 半监督维度约减方法:

    • 半监督主成分分析(Semisupervised PCA): 结合PCA和半监督学习,允许使用标记和未标记的数据来进行维度约减。
    • 半监督学习的自编码器: 结合自编码器和半监督学习思想,利用标记和未标记数据进行特征学习。

四、PCA

        PCA的基本思路是通过找到数据中方差最大的方向,将数据映射到这个方向上,从而实现维度的降低。这个方向被称为第一主成分。接着,找到与第一主成分正交且方差次大的方向,这就是第二主成分。通过不断重复这个过程,我们可以找到一组主成分,它们捕捉了数据中的主要变化,同时降低了维度。这些主成分是原始特征的线性组合。PCA的目标是通过最大化方差,找到数据中最重要的方向,以实现有效的降维。

        主成分可以通过协方差矩阵的特征值和特征向量来定义。给定一个包含n个样本和p个特征的数据矩阵X(其中每行是一个样本,每列是一个特征),协方差矩阵记作C。协方差矩阵的特征值(eigenvalues)和特征向量(eigenvectors)满足以下方程:

Cv_i =\lambda_ivi

        其中,λi​ 是第i个特征值,vi​ 是对应的第i个特征向量。这表示在特征向量方向上的变化由特征值表示。

        主成分就是协方差矩阵的特征向量,它们描述了数据中方差最大的方向。这些特征向量通常按照对应的特征值的大小进行排序,从而确定主成分的重要性。第一主成分对应着最大的特征值,第二主成分对应着第二大的特征值,以此类推。

        通过选择前k个主成分,我们可以将数据映射到一个k维的子空间,实现维度的约减。这个子空间由选定的主成分张成,从而最大程度地保留了原始数据的方差。

        考虑某一原始特征x_i,其中心化后的值变为x_i - \bar{x}_i。假设我们要沿某一基准向量 u_i的方向进行投影。由于u_i是基准向量,其模为1,即 u_i^T u_i = 1。设两个向量之间的夹角为 \theta,那么其投影后的向量可以表示为 |x_i - \bar{x}_i| \cos \theta,其中投影前的两个向量的内积为 |x_i - \bar{x}_i| |u_i| \cos \theta。因此,投影后的向量可以表达为两个向量的内积(x_i - \bar{x}_i)^T u_i​。

        为了使投影方差最大,即使全局投影后的方差最大,我们要考虑全局投影后的方差。投影后全量的均值为:

\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x}_i)^T u_i

        这个表达式中,\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x}_i)^T u_i 表示了投影后的全量均值,我们的目标是通过选择合适的 u_i使得这个均值达到最大。

        我们的目标是使投影方差最大,即全局投影后的方差达到最大。投影后的全量均值可表示为:

\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x}_i)^T u_i = u_i \sum_{i=1}^{n} \frac{1}{n} (x_i - \bar{x}_i)^T = 0

因此,投影后的方差为:

J = \frac{1}{n} \sum_{i=1}^{n} \left[ (x_i - \bar{x}_i)^T u_i \right]^2 \\= \frac{1}{n} \sum_{i=1}^{n} u_i^T (x_i - \bar{x}_i)(x_i - \bar{x}_i)^T u_i \\= u_i^T \sum_{i=1}^{n} \frac{1}{n} (x_i - \bar{x}_i)(x_i - \bar{x}_i)^T u_i

        其中 \sum_{i=1}^{n} \frac{1}{n} (x_i - \bar{x}_i)(x_i - \bar{x}_i)^T 就是中心化后矩阵的协方差矩阵,我们设其为S。因此,可以得到:J = u_i^T \sum_{i=1}^{n} \frac{1}{n} (x_i - \bar{x}_i)(x_i - \bar{x}_i)^T u_i

        这变成了一个带有约束的优化问题,我们将其转化为拉格朗日形式:

L(\mu_i, \lambda) = \mu_i^T S \mu_i + \lambda (1 - \mu_i^T \mu_i)

        对 u_i​ 求偏导令其等于0得:

\frac{\partial L(\mu_i,\lambda)}{\partial \mu_i} = 2S\mu_i - 2\lambda\mu_i = 0

        因此,可得:

S \mu_i = \lambda \mu_i

        这里的 \lambda 就可以等同于协方差矩阵的特征值,\mu _i为对应的特征向量。

        将其带入 L 可得:

L = \arg\max \mu_i^T \lambda \mu_i

        由于 \lambda是一个实数,因此可以得到:

L = \arg\max \lambda \mu_i^T \mu_i = \arg\max \lambda

因此,在进行降维时,我们优先选择特征值较大的特征向量。

五、PCA 的核方法

        主成分分析(PCA)的核方法是一种通过使用核函数来进行非线性降维的扩展。在传统PCA中,我们使用线性变换来找到数据中的主要方差方向,但是对于非线性关系,线性PCA的效果可能不佳。核PCA通过引入核函数,允许在高维特征空间中进行非线性映射,从而更好地捕捉数据中的非线性结构。

以下是核PCA的基本思想和步骤:

  1. 选择核函数: 核函数是核PCA的关键。常用的核函数包括多项式核、高斯核(径向基函数核)等。核函数定义了数据在高维空间中的内积,使得非线性关系得以表示。

  2. 构建核矩阵: 使用选择的核函数计算每对样本之间的相似度,构建核矩阵(Gram矩阵)。核矩阵的元素 K_ij 表示样本 i 和样本 j 之间的相似度。

  3. 中心化核矩阵: 将核矩阵进行中心化,确保样本在高维空间中的均值为零。

  4. 特征值分解: 对中心化的核矩阵进行特征值分解。得到的特征值和特征向量对应着非线性映射后的主成分。

  5. 选择主成分: 选择对应最大特征值的特征向量作为第一主成分,依次选择后续主成分。

  6. 投影: 将数据投影到选定的主成分上,完成降维。

        核PCA的优势在于它能够处理非线性关系,从而更灵活地适应复杂的数据结构。然而,核PCA也有一些挑战,如选择合适的核函数和调整相关参数的问题。此外,计算复杂性也随着高维映射的引入而增加。

        核PCA方法的优点在于,与线性PCA类似,主成分对应的较大特征值越重要,能够有效对非线性点云进行降维。然而,其缺点在于核数据矩阵 K 的维度为 n*n,其中 n是样本数量。因此,当样本数量较大时,进行特征值分解变得困难,导致核PCA难以适应大数据。计算样本在主方向上的分量的计算量与样本数量成正比,因此在样本数量较多时,计算效率较低,而特征向量 p_i​ 的尺寸为 n,导致在样本数量较多时存储量庞大。

        为了在非线性点云中获得良好的主方向提取效果,必须对样本空间进行足够密集的采样,以确保采样到的点云能够近似表示构成完整高维曲面形状的点云。如果密度不足,曲面可能会出现许多“大洞”,这些“大洞”处的样本性质不可能由大洞附近的样本推断出来。由于点云代表曲面,处于“大洞”处的点云性质可能与最接近的点云有很大差异。为什么不采集足够密集的样本呢?然而,这将面临“维数灾难”!假设样本空间的维度为m,分布在单位立方体内,每维均匀等间隔采样,间隔为 d,则总样本数为(\frac{1}{d})^m。当 m 很大时,例如最常见的图像、语言、语音等,其维度假设最小在100左右,实际上可能远大于100。当 \frac{1}{d} = 1000 时,需要10^{300}的样本数,这比宇宙中基本粒子的总数 10^{80}还多!实际上,任何涉及非线性的机器学习算法都需要密集采样,都会遇到“维数灾难”问题,只是有些算法更聪明,能够更好地根据附近点云预测大洞处的点云。在这种情况下,我们称算法具有更好的泛化性能,泛化性能是指算法预测大洞处点云的能力,或者说举一反三的能力。泛化性能优越的算法能够降低采样密度。

六、案例

        这段代码主要通过线性判别分析(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在数据可视化和噪声过滤方面的优势。通过绘制散点图,我清晰地观察到数据在新坐标系中的分布情况,有助于更好地理解数据结构。此外,通过排除主成分对应的小特征值,我成功过滤了数据中的噪声,提高了分析的准确性。

  • 30
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NINGCONG2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值