文章目录
主成分分析(PCA)是一种用于数据降维的技术。它通过线性变换将数据转换到新的坐标系统中,使得在新坐标系的第一个坐标(即第一个主成分)具有最大方差,第二个坐标具有第二大方差,依此类推。
PCA的基本步骤
- 标准化数据:
- 数据标准化是为了使每个特征维度对结果的影响相同。
- 通常,这涉及到减去每个特征的平均值,然后除以标准差。
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
- 计算协方差矩阵:
- 协方差矩阵表示数据特征间的相关性。
- 协方差矩阵的计算可以通过
numpy
库的np.cov
函数实现。
# 2. 计算协方差矩阵
covariance_matrix = np.cov(X_normalized.T)
- 计算协方差矩阵的特征值和特征向量:
- 这一步是PCA的核心,特征值和特征向量决定了数据的主成分。
- 可以使用
numpy
库的np.linalg.eig
函数来计算。
# 3. 计算协方差矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
- 选择主成分:
- 根据特征值的大小,选择最重要的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
个主成分。这些主成分是降维后数据的基础,它们捕获了数据中最大的方差。
- 转换到新的坐标系:
- 使用主成分作为基,将原始数据投影到新的坐标系中。
- 这可以通过将数据点与特征向量相乘来实现。
# 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=Xnormalized⋅P
-
这里, 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算法的关键步骤之一,用于降维和提取数据中最重要的特征。