主成分分析(PCA)算法

news/2025/1/8 22:00:25/

主成分分析(PCA)算法

主成分分析(Principal Component Analysis, PCA)是一种常用的无监督降维算法,主要用于数据的特征提取和维度压缩。其目标是将高维数据映射到低维空间,同时尽可能保留数据的主要信息。


PCA的主要思想

  1. 寻找新的坐标轴(主成分),使数据在这些轴上的方差最大。
  2. 这些新坐标轴是数据的线性组合,并且彼此正交(无相关性)。
  3. 降维通过选择前 k 个方差最大的主成分实现。

PCA的数学原理

1. 数据标准化

为避免特征量纲(单位)对结果的影响,需要对原始数据进行标准化处理:

x_{ij}' = \frac{x_{ij} - \mu_j}{\sigma_j}

其中:

  • x_{ij}​ 是原始数据的第 i 个样本在第 j 个特征上的值;
  • \mu_j 是第 j 个特征的均值;
  • \sigma_j 是第 j 个特征的标准差。

2. 协方差矩阵

计算标准化数据的协方差矩阵 Σ :

\Sigma = \frac{1}{n-1} X^T X

其中:

  • X 是标准化后的数据矩阵;
  • 协方差矩阵 Σ 的每个元素 \sigma_{ij}​ 表示特征 i 和特征 j 的协方差。

3. 特征分解

对协方差矩阵 Σ 进行特征值分解:

\Sigma v = \lambda v

其中:

  • λ 是特征值,表示数据在对应特征向量方向上的方差;
  • v 是特征向量,表示主成分的方向。

按照特征值从大到小排序,选取前 k 个特征向量对应的主成分,构造变换矩阵 W 。


4. 数据降维

将原始数据 X映射到低维空间:

Z=X W

其中:

  • Z 是降维后的数据;
  • W 是由前 k 个特征向量组成的矩阵。

PCA算法步骤

  1. 输入:原始数据矩阵 X(m×n ,其中 m 是样本数,n 是特征数)。
  2. 数据标准化:对 X 的每个特征进行标准化。
  3. 计算协方差矩阵:计算标准化数据的协方差矩阵 Σ 。
  4. 特征值分解:对协方差矩阵进行特征值分解,获得特征值和特征向量。
  5. 选择主成分:按特征值从大到小排序,选择前 k 个主成分。
  6. 降维:将原始数据映射到主成分构成的低维空间。

PCA算法的Python实现

以下是PCA算法的实现代码:

python">import numpy as npdef pca(X, num_components):"""主成分分析(PCA)算法实现参数:X: 原始数据矩阵 (m, n),m为样本数,n为特征数num_components: 要保留的主成分数返回:Z: 降维后的数据矩阵 (m, num_components)W: 主成分矩阵 (n, num_components)"""# 1. 数据标准化X_mean = np.mean(X, axis=0)  # 均值X_std = np.std(X, axis=0)  # 标准差X_normalized = (X - X_mean) / X_std# 2. 计算协方差矩阵covariance_matrix = np.cov(X_normalized, rowvar=False)# 3. 特征值分解eigenvalues, eigenvectors = np.linalg.eigh(covariance_matrix)# 4. 按特征值从大到小排序sorted_indices = np.argsort(eigenvalues)[::-1]top_indices = sorted_indices[:num_components]top_eigenvectors = eigenvectors[:, top_indices]# 5. 数据降维Z = np.dot(X_normalized, top_eigenvectors)return Z, top_eigenvectors# 测试
if __name__ == "__main__":# 示例数据:4个样本,3个特征X = np.array([[2.5, 2.4, 3.5],[0.5, 0.7, 1.2],[2.2, 2.9, 3.1],[1.9, 2.2, 2.7]])num_components = 2Z, W = pca(X, num_components)print("降维后的数据:\n", Z)print("主成分矩阵:\n", W)

PCA的优点

  1. 减少数据维度,降低计算复杂度;
  2. 去除冗余特征,增强模型的泛化能力;
  3. 有效消除特征之间的相关性。

PCA的局限性

  1. PCA只考虑方差最大化,可能丢失对分类有意义的特征;
  2. PCA假设特征与均值的线性关系,不适用于非线性数据;
  3. 对数据的标准化敏感。

http://www.ppmy.cn/news/1561642.html

相关文章

HTML5语义化编程

常见的 HTML5 语义化标签 <header>&#xff1a;定义文档或节的头部区域&#xff0c;通常包含标题、logo、导航链接等。<nav>&#xff1a;表示导航链接的部分&#xff0c;适合用来包裹主要的导航菜单。<main>&#xff1a;标识文档的主要内容&#xff0c;每个…

Linux初识——基本指令

我们在linux下输入各种指令&#xff0c;其实就相当于在windows中的相关操作&#xff0c;比如双击&#xff0c;新建文件夹等。 以下是相关基本指令基本用法 一.ls&#xff08;显示当前目录下的所有文件和目录&#xff09; 那如何显示当前目录&#xff08;我们所在的位置&…

F#语言的数据结构

F#语言的数据结构浅析 F#是一种函数式编程语言&#xff0c;属于.NET生态系统。作为一种强类型语言&#xff0c;F#支持丰富的数据结构&#xff0c;使得编写复杂算法和数据处理变得更加高效和便利。在这篇文章中&#xff0c;我们将深入探讨F#的主要数据结构&#xff0c;包括元组…

STM32H7的SPI总线基础知识备忘

一 概念 STM32H7的SPI支持4到32bit数据传输&#xff0c;而STM32F1和F4系列仅支持8bit或者16bit。 STM32H7的主频400MHz时&#xff0c;SPI1, 2, 3最高通信时钟是100MHz&#xff0c;而SPI4, 5, 6是50MHz。 STM32H7的MISO和MOSI引脚功能可以互换&#xff0c;使用比较灵活。 …

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

代码随想录算法【Day11】

150. 逆波兰表达式求值 class Solution { public:int evalRPN(vector<string>& tokens) {// 力扣修改了后台测试数据&#xff0c;需要用longlongstack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &…

Spring Boot 多环境配置与切换

Spring Boot 多环境配置与切换 当在多配置文件中&#xff0c;需要切换配置文件时&#xff0c;通常的做法都是修改激活的文件名称&#xff0c;而spring.profiles.activeprofiles.active是配合maven profile进行选择不同配置文件进行启动&#xff0c;可以避免修改文件&#xff0…

javafx 将项目打包为 Windows 的可执行文件exe

要将 JavaFX 项目打包为 .exe 文件&#xff0c;你可以使用一些工具将你的应用程序封装为 Windows 可执行文件。以下是两种常用的方法&#xff1a; 方法 1&#xff1a;使用 jpackage&#xff08;适用于 JDK 14 及更高版本&#xff09; jpackage 是 JDK 内置的工具&#xff0c;…