当前位置: 首页 > news >正文

机器学习PCA和LDA

主成分分析(PCA, Principal Component Analysis)和线性判别分析(LDA, Linear Discriminant Analysis)是两种常用的降维方法,它们虽然都用于数据降维,但核心思想和应用场景不同。

PCA(主成分分析)

PCA 是一种无监督学习方法,主要用于特征降维,以最大化数据的方差,同时减少信息损失。其核心思想是找到数据的主成分(方差最大的方向),然后对数据进行投影,从而降低维度。

PCA的步骤
  1. 将数据中心化(去均值)并标准化,以消除量纲影响。
  2. 衡量不同特征之间的相关性。
  3. 找到协方差矩阵的特征值和特征向量,特征向量代表数据的主方向,特征值表示该方向上的方差信息量。
  4. 根据特征值大小选择前 K K K个特征向量构成新的特征空间。
  5. 用选择的特征向量将原始数据投影到新的低维空间。

它不考虑类别标签,仅关注数据的整体分布,通过选择方差最大的方向来保留最多的信息。其主要作用是特征降维,去除冗余特征,并用于数据可视化,尤其适用于高维数据的降维处理,以便于后续分析和建模。

def pca(X:np.array, n_components:int) -> np.array:
    """
    使用 NumPy 实现 PCA 进行降维。
    
    参数:
    X: ndarray, 形状 (n_samples, n_features),输入数据矩阵
    n_components: int, 降维后的维度数
    
    返回:
    X_pca: ndarray, 形状 (n_samples, n_components),降维后的数据
    """
    # 1. 数据标准化(去均值)
    X_mean = np.mean(X, axis=0)
    X_centered = X - X_mean
    
    # 2. 计算协方差矩阵
    covariance_matrix = np.cov(X_centered, rowvar=False)
    
    # 3. 计算特征值和特征向量
    eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
    
    # 4. 按特征值降序排序
    sorted_indices = np.argsort(eigenvalues)[::-1]
    top_eigenvectors = eigenvectors[:, sorted_indices[:n_components]]
    
    # 5. 投影到新空间
    X_pca = np.dot(X_centered, top_eigenvectors)
    
    return X_pca

LDA (线性判别分析)

LDA 是一种有监督的降维方法,目标是在降维的同时最大化类别之间的可分性。与 PCA 不同,LDA 利用类别标签来优化数据投影,使得不同类别的样本尽可能分开。

LDA的步骤
  1. 计算类内散度矩阵 S W S_W SW
  2. 计算类间散度矩阵 S B S_B SB
  3. 求解投影方向
  4. 选择前 k k k个特征向量组成投影矩阵 W W W

它利用类别信息来优化数据投影,使得不同类别的样本在低维空间中尽可能分开。通过最大化类间距离并最小化类内方差,LDA能够增强类别可分性,因此广泛应用于分类任务,如人脸识别、文本分类等,有助于提高模型的分类性能。

def lda(X:np.array, y:np.array, n_components:int) -> np.array:
    """
    使用 NumPy 实现 LDA 降维
    :param X: 样本特征矩阵 (n_samples, n_features)
    :param y: 样本类别标签 (n_samples,)
    :param n_components: 目标降维维度
    :return: 投影后的数据 X_lda
    """
    # 获取类别列表
    classes = np.unique(y)
    n_features = X.shape[1]

    # 计算总均值
    mean_total = np.mean(X, axis=0)

    # 计算类内散度矩阵 Sw 和 类间散度矩阵 Sb
    S_W = np.zeros((n_features, n_features))
    S_B = np.zeros((n_features, n_features))

    for c in classes:
        X_c = X[y == c]  # 取出类别 c 的所有样本
        mean_c = np.mean(X_c, axis=0)  # 计算类别 c 的均值
        S_W += np.cov(X_c, rowvar=False) * (X_c.shape[0] - 1)  # 类内散度矩阵
        mean_diff = (mean_c - mean_total).reshape(-1, 1)
        S_B += X_c.shape[0] * (mean_diff @ mean_diff.T)  # 类间散度矩阵

    # 计算 Sw^-1 * Sb 的特征值和特征向量
    eigvals, eigvecs = np.linalg.eig(np.linalg.inv(S_W) @ S_B)

    # 选取前 n_components 个特征向量(按特征值降序排序)
    sorted_indices = np.argsort(eigvals)[::-1]
    W = eigvecs[:, sorted_indices[:n_components]]

    # 投影数据到 LDA 低维空间
    X_lda = X @ W

    return X_lda, W

PCA vs. LDA

PCALDA
类别信息无监督,不考虑类别有监督,利用类别信息
目标最大化数据方差,保留最多信息最大化类间距离,增强类别可分性
计算计算协方差矩阵的特征值计算类间/类内散度矩阵的特征值
应用场景适用于降维、特征提取、数据压缩适用于分类任务,提高模型性能

相关文章:

  • du-磁盘占用管理
  • 基于Python实现的缓存淘汰替换策略算法,该算法将缓存分区
  • MongoDB 架构设计:深入解析核心组件与工作原理
  • 二分搜索法、二分查找法【C/C ++】
  • 数据结构:最小生成树
  • FFmpeg源码:av_strlcpy函数分析
  • 探索 DeepSeek:AI 领域的璀璨新星
  • 深度学习实战道路裂缝缺陷识别
  • 计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程
  • PyTorch 源码学习:阅读经验 代码结构
  • Flink提交pyflink任务
  • pytest asyncio 支持插件 pytest-asyncio
  • 基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)
  • python opencv基础使用总结
  • 41.日常算法
  • 介绍两本学习智谱大模型的入门图书
  • Java小白入门基础知识(二)
  • 晶闸管主要参数分析与损耗计算
  • JavaScript 内置对象-日期对象
  • Ubuntu 系统 LVM 逻辑卷扩容教程
  • 结婚这件事,年轻人到底怎么想的?
  • 孕妇乘坐高铁突发临产,广西铁路部门协助送医平安产子
  • 李铁案二审今日宣判,押送警车已进入法院
  • 俄乌战火不熄,特朗普在梵蒂冈与泽连斯基会晤后口风突变
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 下任美联储主席热门人选沃什:美联储犯下“系统性错误”,未能控制一代人以来最严重的通胀