主成分分析(PCA)

文章目录

      • PCA的基本步骤
        • 特征值排序
        • 反转索引
        • 选择主成分
      • 结果
      • 应用场景
      • 协方差矩阵的数学解释
        • 协方差的定义
        • 协方差的含义
        • 协方差矩阵
      • 矩阵转置(X_normalized.T)
        • 为何需要转置
      • 在PCA中协方差矩阵的作用
      • NumPy中的 `np.linalg.eig` 函数
        • 特征值和特征向量的定义
        • 特征值和特征向量的意义
        • `np.linalg.eig` 函数的应用
      • 数据投影到主成分
        • 数学原理
        • 投影的作用
        • 代码

主成分分析(PCA)是一种用于数据降维的技术。它通过线性变换将数据转换到新的坐标系统中,使得在新坐标系的第一个坐标(即第一个主成分)具有最大方差,第二个坐标具有第二大方差,依此类推。

PCA的基本步骤

  1. 标准化数据
    • 数据标准化是为了使每个特征维度对结果的影响相同。
    • 通常,这涉及到减去每个特征的平均值,然后除以标准差。
import numpy as np
# 假设 X 是原始数据
# 1. 数据标准化
X_mean = np.mean(X, axis=0)
X_std = np.std(X, axis=0)
X_normalized = (X - X_mean) / X_std
  1. 计算协方差矩阵
    • 协方差矩阵表示数据特征间的相关性。
    • 协方差矩阵的计算可以通过 numpy 库的 np.cov 函数实现。
# 2. 计算协方差矩阵
covariance_matrix = np.cov(X_normalized.T)
  1. 计算协方差矩阵的特征值和特征向量
    • 这一步是PCA的核心,特征值和特征向量决定了数据的主成分。
    • 可以使用 numpy 库的 np.linalg.eig 函数来计算。
# 3. 计算协方差矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
  1. 选择主成分
    • 根据特征值的大小,选择最重要的n个特征向量作为主成分。
    • 一般选择的是特征值最大的n个特征向量。
# 4. 选择主成分
# 例如,选择前两个主成分
n_components = 2
indices = np.argsort(eigenvalues)[::-1]
principal_components = eigenvectors[:, indices[:n_components]]
特征值排序
  • 首先,特征值按照大小进行排序。大的特征值对应的特征向量代表了数据中方差较大的方向。
  • np.argsort 函数返回的是数组值从小到大的索引值。对特征值数组 eigenvalues 使用 np.argsort 将给出排序后特征值的索引。
反转索引
  • [::-1] 是Python中的切片操作,它将数组反转。因为我们想要从大到小的顺序,所以需要反转 np.argsort 的结果。
选择主成分
  • n_components 指定了要选择的主成分的数量。
  • indices[:n_components] 选择了特征值最大的前 n_components 个特征向量的索引。
  • eigenvectors[:, indices[:n_components]] 则根据这些索引从特征向量矩阵中提取对应的列,即选择了最重要的 n_components 个特征向量作为主成分。

结果

  • 这些步骤完成后,principal_components 包含了数据集的前 n_components 个主成分。这些主成分是降维后数据的基础,它们捕获了数据中最大的方差。
  1. 转换到新的坐标系
    • 使用主成分作为基,将原始数据投影到新的坐标系中。
    • 这可以通过将数据点与特征向量相乘来实现。
# 5. 转换到新的坐标系
X_pca = np.dot(X_normalized, principal_components)

应用场景

PCA常用于减少数据集的维度,同时尽可能保留原始数据的特性。它在图像处理、语音识别、基因数据分析等领域有广泛应用。

协方差矩阵的数学解释

协方差矩阵在统计学和数据分析中扮演着关键角色,尤其是在理解多个变量之间关系的上下文中。

协方差的定义
  • 协方差 是衡量两个变量之间线性关系的统计量。
  • 对于两个随机变量 ( X ) 和 ( Y ),其协方差定义为:

Cov ( X , Y ) = E [ ( X − μ X ) ( Y − μ Y ) ] \text{Cov}(X, Y) = E[(X - \mu_X)(Y - \mu_Y)] Cov(X,Y)=E[(XμX)(YμY)]

其中, E E E 是期望值运算符, μ X \mu_X μX μ Y \mu_Y μY分别是 X X X Y Y Y 的均值。

协方差的含义
  • 当两个变量的协方差为正时,表明这两个变量随着一个变量的增加而同向增加。
  • 当协方差为负时,表明它们随着一个变量的增加而反向变化。
协方差矩阵
  • 对于一个包含 N N N个特征的数据集,协方差矩阵是一个 N × N N \times N N×N的矩阵,其中每个元素 Cov ( X i , X j ) \text{Cov}(X_i, X_j) Cov(Xi,Xj) 代表特征 X i X_i Xi X j X_j Xj 的协方差。
  • 矩阵对角线上的元素是每个特征自己的方差,非对角线上的元素是不同特征间的协方差。

矩阵转置(X_normalized.T)

矩阵转置是将矩阵的行转换为列,或将列转换为行的操作。在PCA中,数据转置通常是必要的预处理步骤。

为何需要转置
  • 在PCA中,我们通常处理的数据矩阵 X X X以样本为行,特征为列的格式排列。即每一行是一个观测值,每一列是一个特征。
  • 为了计算协方差矩阵,我们需要特征作为行,每个数据点作为列。因此,需要对数据矩阵进行转置。
  • 转置后的矩阵 X T X^T XT使得每一行代表一个特征,每一列代表一个样本。

在PCA中协方差矩阵的作用

  • PCA 旨在找出数据中最重要的几个主成分,这些主成分捕捉了数据中的最大方差。
  • 通过分析协方差矩阵的特征值和特征向量,PCA 能够确定数据的主成分。特征向量定义了新的坐标轴,而特征值则给出了这些轴的相对重要性。

NumPy中的 np.linalg.eig 函数

在数学和数据分析中,特征值和特征向量是理解线性变换的关键概念。np.linalg.eig 函数来自Python的NumPy库,用于计算方阵的特征值和特征向量。

特征值和特征向量的定义
  • 对于给定的方阵 A A A,特征向量 v v v 和对应的特征值 λ \lambda λ 满足以下等式:

    A v = λ v A \mathbf{v} = \lambda \mathbf{v} Av=λv

  • 这里, A A A 是一个方阵, v \mathbf{v} v 是一个非零向量, λ \lambda λ 是一个标量(特征值)。

特征值和特征向量的意义
  • 特征值和特征向量给出了方阵 A A A 的一个非常重要的性质:在变换 A A A 下,向量 v \mathbf{v} v 仅通过缩放其大小而不改变其方向。
  • 换句话说, v \mathbf{v} v 是方阵 A A A 的一个“固有方向”,而对应的特征值 λ \lambda λ 是这个方向上的“缩放因子”。
np.linalg.eig 函数的应用
  • 在PCA(主成分分析)中,np.linalg.eig 用于找出协方差矩阵的特征向量和特征值。
  • 这些特征向量定义了数据的新坐标系,而特征值则表示在这些坐标轴上的数据方差的大小。
  • 在PCA中,我们通常按照特征值的大小来选择最重要的特征向量,这些向量构成了数据的主成分。
import numpy as np

# 假设 A 是一个方阵
A = np.array([[4, 2], [1, 3]])

# 使用 np.linalg.eig 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)

# 输出特征值和特征向量
print("特征值:", eigenvalues)
print("特征向量:", eigenvectors)

数据投影到主成分

在主成分分析(PCA)中,数据投影到选定的主成分上是核心步骤之一。这一步骤通过矩阵乘法实现,将原始数据转换到由主成分定义的新坐标系中。

数学原理
  • 假设 X normalized X_{\text{normalized}} Xnormalized 是标准化后的数据矩阵,其中每一行代表一个样本,每一列代表一个特征。

  • X pca X_{\text{pca}} Xpca 是投影后的数据,其中包含了主成分分析降维后的数据。

  • 主成分(由特征向量构成)存储在矩阵 P P P 中,每一列是一个主成分。

  • 投影的数学表达式为:

    X pca = X normalized ⋅ P X_{\text{pca}} = X_{\text{normalized}} \cdot P Xpca=XnormalizedP

  • 这里, X normalized X_{\text{normalized}} Xnormalized P P P 的矩阵乘法将原始数据投影到主成分定义的新坐标系中。

投影的作用
  • 这种投影通常用于降维,它保留了数据中最重要的特征(即方差最大的方向)。
  • 在新坐标系中,主成分是正交的,这有助于消除原始特征间的相关性。
  • 投影后的数据可以用于可视化、数据压缩或进一步的数据分析。
代码
import numpy as np

# 假设 X_normalized 是标准化后的数据
# principal_components 是主成分,即选定的特征向量

# 数据投影到主成分
X_pca = np.dot(X_normalized, principal_components)

# 输出投影后的数据
print("投影后的数据:", X_pca)

在这段代码中,使用 np.dot 函数完成了矩阵乘法,将标准化后的数据矩阵 X_normalized 与主成分矩阵 principal_components 相乘,得到投影后的数据 X_pca。这是实现PCA算法的关键步骤之一,用于降维和提取数据中最重要的特征。

你可能感兴趣的:(numpy,机器学习,python)