PCA降维理论详解
文章目录
- 一、什么是PCA?
- 二、为什么需要降维?
- 三、PCA的数学原理与详细推导
- 视角一:最大化投影方差(Maximizing Variance)
- 视角二:最小化重构误差(Minimizing Reconstruction Error)
- 四、PCA的完整算法步骤
- 五、一个详细的数值例子
- 六、PCA的优缺点
- 优点:
- 缺点:
- 七、scikit-learn中的PCA API详解
- 1. 核心参数 (Parameters)
- 2. 重要属性 (Attributes)
- 3. 核心方法 (Methods)
- 4. 使用示例
在当今这个数据爆炸的时代,我们常常面对海量、高维度的数据。这些数据虽然信息丰富,但也带来了“维度灾难”——计算复杂、可视化困难、模型过拟合风险增加。如何从高维数据中提取最核心、最有价值的信息,同时降低数据的复杂性?主成分分析(Principal Component Analysis, PCA)就是解决这一问题的经典且强大的工具。今天,我们将从数学原理出发,深入剖析PCA的推导过程,最终实现从理论到实践的完整理解。
一、什么是PCA?
PCA是一种无监督的线性降维技术。它的核心思想是:在数据中找到数据方差最大的方向(主成分),并将数据投影到这些方向上,从而用更少的变量(主成分)来最大程度地保留原始数据的信息。
简单来说,PCA就像一个“智能压缩器”,它能自动识别数据中最重要的变化模式,并用这些模式的组合来重新表示数据,达到降维的目的。
二、为什么需要降维?
在深入PCA原理之前,理解降维的必要性很重要:
- 可视化: 人类只能直观理解2D或3D空间。PCA可以将高维数据降至2D或3D,便于我们绘制散点图进行观察。
- 去噪: 数据中的噪声通常表现为方差较小的方向。PCA保留方差大的主成分,相当于过滤掉了一些噪声。
- 提高效率: 减少特征数量可以显著降低后续机器学习模型的训练时间和计算资源消耗。
- 缓解过拟合: 减少特征数量有助于降低模型复杂度,减少过拟合的风险。
- 特征提取: 主成分可以看作是原始特征的线性组合,它们代表了数据的内在结构,有时能提供新的洞察。
三、PCA的数学原理与详细推导
PCA的数学基础是线性代数,特别是特征值分解和协方差矩阵。下面我们从两个核心视角(最大方差和最小重构误差)进行推导,它们最终会得到相同的结果。
视角一:最大化投影方差(Maximizing Variance)
我们的目标是找到一个方向(单位向量 w\mathbf{w}w),使得原始数据点 xi\mathbf{x}_ixi 在这个方向上的投影值 zi=wTxiz_i = \mathbf{w}^T \mathbf{x}_izi=wTxi 的方差最大。
-
数据预处理:中心化 (Centering)
首先,我们假设数据已经进行了中心化处理(均值为0)。这是PCA的标准步骤,因为我们要找的是方差最大的方向,与数据的绝对位置无关。- 中心化后:∑xi=0\sum \mathbf{x}_i = \mathbf{0}∑xi=0
-
投影方差的计算
投影值 zi=wTxiz_i = \mathbf{w}^T \mathbf{x}_izi=wTxi 的方差为:
Var(z)=1n∑(zi−μz)2\text{Var}(z) = \frac{1}{n} \sum (z_i - \mu_z)^2Var(z)=n1∑(zi−μz)2
由于数据中心化,投影的均值 μz=wT⋅1n∑xi=0\mu_z = \mathbf{w}^T \cdot \frac{1}{n} \sum \mathbf{x}_i = 0μz=wT⋅n1∑xi=0。
因此:
Var(z)=1n∑(wTxi)2=1n∑wTxixiTw=wT[1n∑xixiT]w\text{Var}(z) = \frac{1}{n} \sum (\mathbf{w}^T \mathbf{x}_i)^2 = \frac{1}{n} \sum \mathbf{w}^T \mathbf{x}_i \mathbf{x}_i^T \mathbf{w} = \mathbf{w}^T \left[ \frac{1}{n} \sum \mathbf{x}_i \mathbf{x}_i^T \right] \mathbf{w}Var(z)=n1∑(wTxi)2=n1∑wTxixiTw=wT[n1∑xixiT]w -
引入协方差矩阵
定义 样本协方差矩阵 S\mathbf{S}S:
S=1n∑xixiT=1nXTX\mathbf{S} = \frac{1}{n} \sum \mathbf{x}_i \mathbf{x}_i^T = \frac{1}{n} \mathbf{X}^T \mathbf{X}S=n1∑xixiT=n1XTX
(这里 X\mathbf{X}X 是 n×mn \times mn×m 的数据矩阵,nnn 个样本,mmm 个特征,行代表样本,列代表特征)
所以:
Var(z)=wTSw\text{Var}(z) = \mathbf{w}^T \mathbf{S} \mathbf{w}Var(z)=wTSw -
构建优化问题
我们的目标是最大化 Var(z)=wTSw\text{Var}(z) = \mathbf{w}^T \mathbf{S} \mathbf{w}Var(z)=wTSw。
但 w\mathbf{w}w 是一个方向向量,必须是单位向量,即 ∣∣w∣∣=1||\mathbf{w}|| = 1∣∣w∣∣=1 或 wTw=1\mathbf{w}^T \mathbf{w} = 1wTw=1。
这是一个带约束的优化问题:
maxwwTSw\max_{\mathbf{w}} \mathbf{w}^T \mathbf{S} \mathbf{w}wmaxwTSw
s.t. wTw=1\text{s.t. } \mathbf{w}^T \mathbf{w} = 1s.t. wTw=1 -
使用拉格朗日乘子法求解
构造拉格朗日函数:
L(w,λ)=wTSw−λ(wTw−1)\mathcal{L}(\mathbf{w}, \lambda) = \mathbf{w}^T \mathbf{S} \mathbf{w} - \lambda (\mathbf{w}^T \mathbf{w} - 1)L(w,λ)=wTSw−λ(wTw−1)
对 w\mathbf{w}w 求偏导并令其为0:
∂L∂w=2Sw−2λw=0\frac{\partial \mathcal{L}}{\partial \mathbf{w}} = 2\mathbf{S} \mathbf{w} - 2\lambda \mathbf{w} = \mathbf{0}∂w∂L=2Sw−2λw=0
整理得:
Sw=λw\mathbf{S} \mathbf{w} = \lambda \mathbf{w}Sw=λw
这正是特征值分解的标准形式!- w\mathbf{w}w 是协方差矩阵 S\mathbf{S}S 的特征向量。
- λ\lambdaλ 是对应的特征值。
-
选择最优解
将 Sw=λw\mathbf{S} \mathbf{w} = \lambda \mathbf{w}Sw=λw 代入目标函数:
Var(z)=wTSw=wT(λw)=λ(wTw)=λ⋅1=λ\text{Var}(z) = \mathbf{w}^T \mathbf{S} \mathbf{w} = \mathbf{w}^T (\lambda \mathbf{w}) = \lambda (\mathbf{w}^T \mathbf{w}) = \lambda \cdot 1 = \lambdaVar(z)=wTSw=wT(λw)=λ(wTw)=λ⋅1=λ
这意味着,投影方差 Var(z)\text{Var}(z)Var(z) 等于特征值 λ\lambdaλ。
因此,为了最大化方差,我们应该选择最大的特征值 λmax\lambda_{\text{max}}λmax 对应的特征向量 w\mathbf{w}w 作为第一个主成分(PC1)。 -
寻找后续主成分
第二个主成分需要在与第一个主成分正交的约束下,最大化投影方差。
优化问题变为:
maxwwTSw\max_{\mathbf{w}} \mathbf{w}^T \mathbf{S} \mathbf{w}wmaxwTSw
s.t. wTw=1,wTw1=0\text{s.t. } \mathbf{w}^T \mathbf{w} = 1, \mathbf{w}^T \mathbf{w}_1 = 0s.t. wTw=1,wTw1=0 (w1\mathbf{w}_1w1 是PC1的特征向量)
同样使用拉格朗日乘子法,会得到 Sw=λw\mathbf{S} \mathbf{w} = \lambda \mathbf{w}Sw=λw,并且由于正交性约束,w\mathbf{w}w 必须是与 w1\mathbf{w}_1w1 正交的特征向量。因此,第二个主成分对应第二大的特征值的特征向量。
以此类推,第 kkk 个主成分对应第 kkk 大的特征值的特征向量。
视角二:最小化重构误差(Minimizing Reconstruction Error)
另一个等价的视角是:我们希望找到一个低维表示,使得从低维表示重构回原始高维空间时,产生的误差最小。
-
设定问题
假设我们想将 mmm 维数据降至 kkk 维 (k<mk < mk<m)。
设 W\mathbf{W}W 是一个 m×km \times km×k 的矩阵,其列向量 w1,...,wk\mathbf{w}_1, ..., \mathbf{w}_kw1,...,wk 是 kkk 个主成分方向(单位正交向量)。
原始数据点 xi\mathbf{x}_ixi 在低维空间的表示为 zi=WTxi\mathbf{z}_i = \mathbf{W}^T \mathbf{x}_izi=WTxi。
从低维重构回原始空间的点为 xi′=Wzi=WWTxi\mathbf{x}'_i = \mathbf{W} \mathbf{z}_i = \mathbf{W} \mathbf{W}^T \mathbf{x}_ixi′=Wzi=WWTxi。
重构误差(平方误差)为:
J=1n∑∣∣xi−xi′∣∣2=1n∑∣∣xi−WWTxi∣∣2J = \frac{1}{n} \sum ||\mathbf{x}_i - \mathbf{x}'_i||^2 = \frac{1}{n} \sum ||\mathbf{x}_i - \mathbf{W} \mathbf{W}^T \mathbf{x}_i||^2J=n1∑∣∣xi−xi′∣∣2=n1∑∣∣xi−WWTxi∣∣2 -
简化目标函数
利用矩阵迹(Trace)的性质 ∣∣A∣∣F2=Tr(ATA)||\mathbf{A}||^2_F = \text{Tr}(\mathbf{A}^T \mathbf{A})∣∣A∣∣F2=Tr(ATA) 和迹的循环置换性 Tr(ABC)=Tr(CAB)\text{Tr}(\mathbf{ABC}) = \text{Tr}(\mathbf{CAB})Tr(ABC)=Tr(CAB),可以将 JJJ 转化为:
J=1nTr((X−XWWT)T(X−XWWT))J = \frac{1}{n} \text{Tr}\left((\mathbf{X} - \mathbf{X} \mathbf{W} \mathbf{W}^T)^T (\mathbf{X} - \mathbf{X} \mathbf{W} \mathbf{W}^T)\right)J=n1Tr((X−XWWT)T(X−XWWT))
展开后,经过一系列推导(此处略去详细步骤,可参考相关文献),最终可以得到:
J=Tr(S)−Tr(WTSW)J = \text{Tr}(\mathbf{S}) - \text{Tr}(\mathbf{W}^T \mathbf{S} \mathbf{W})J=Tr(S)−Tr(WTSW)
其中 S=1nXTX\mathbf{S} = \frac{1}{n} \mathbf{X}^T \mathbf{X}S=n1XTX 是协方差矩阵。 -
构建优化问题
由于 Tr(S)\text{Tr}(\mathbf{S})Tr(S) 是常数(所有特征值之和),最小化 JJJ 等价于最大化 Tr(WTSW)\text{Tr}(\mathbf{W}^T \mathbf{S} \mathbf{W})Tr(WTSW)。
即:
maxWTr(WTSW)\max_{\mathbf{W}} \text{Tr}(\mathbf{W}^T \mathbf{S} \mathbf{W})WmaxTr(WTSW)
s.t. WTW=Ik\text{s.t. } \mathbf{W}^T \mathbf{W} = \mathbf{I}_ks.t. WTW=Ik (Ik\mathbf{I}_kIk 是 k×kk \times kk×k 单位矩阵,保证 W\mathbf{W}W 的列向量正交) -
求解
这个优化问题的最优解是:W\mathbf{W}W 的列向量 w1,...,wk\mathbf{w}_1, ..., \mathbf{w}_kw1,...,wk 应该是协方差矩阵 S\mathbf{S}S 的前 kkk 个最大特征值对应的特征向量。
此时,Tr(WTSW)=∑i=1kλi\text{Tr}(\mathbf{W}^T \mathbf{S} \mathbf{W}) = \sum_{i=1}^k \lambda_iTr(WTSW)=∑i=1kλi,即前 kkk 个主成分的方差之和。
结论: 无论是最大化投影方差,还是最小化重构误差,我们都得到了相同的结论——主成分就是协方差矩阵的特征向量,且按特征值从大到小排序。
四、PCA的完整算法步骤
综合以上推导,PCA的标准流程如下:
-
数据预处理:标准化 (Standardization)
- 对每个特征进行标准化:zj=(xj−μj)/σjz_j = (x_j - \mu_j) / \sigma_jzj=(xj−μj)/σj
- 为什么需要标准化? 如果特征量纲不同(如身高用米,体重用公斤),量纲大的特征会主导协方差矩阵,导致主成分方向偏向这些特征。标准化确保所有特征在同等尺度上比较。
-
计算协方差矩阵 (Covariance Matrix)
- S=1n−1XTX\mathbf{S} = \frac{1}{n-1} \mathbf{X}^T \mathbf{X}S=n−11XTX (使用 n−1n-1n−1 是为了无偏估计,
sklearn
默认如此) - X\mathbf{X}X 是标准化后的 n×mn \times mn×m 数据矩阵。
- S=1n−1XTX\mathbf{S} = \frac{1}{n-1} \mathbf{X}^T \mathbf{X}S=n−11XTX (使用 n−1n-1n−1 是为了无偏估计,
-
计算特征值和特征向量 (Eigenvalue Decomposition)
- 对 S\mathbf{S}S 进行特征值分解:Svi=λivi\mathbf{S} \mathbf{v}_i = \lambda_i \mathbf{v}_iSvi=λivi
- 得到 mmm 个特征值 λ1≥λ2≥...≥λm\lambda_1 \geq \lambda_2 \geq ... \geq \lambda_mλ1≥λ2≥...≥λm 和对应的特征向量 v1,v2,...,vm\mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_mv1,v2,...,vm。
-
选择主成分数量 kkk
- 累计解释方差比 (Cumulative Explained Variance Ratio):
- 第 iii 个主成分的解释方差比:λi/∑j=1mλj\lambda_i / \sum_{j=1}^m \lambda_jλi/∑j=1mλj
- 选择最小的 kkk,使得 (λ1+...+λk)/(λ1+...+λm)≥threshold(\lambda_1 + ... + \lambda_k) / (\lambda_1 + ... + \lambda_m) \geq \text{threshold}(λ1+...+λk)/(λ1+...+λm)≥threshold (如 0.95 或 0.99)。
- “肘部法则” (Elbow Method): 绘制特征值(或方差贡献率)随主成分序号变化的曲线,寻找曲线明显变平缓的“肘部”点。
- 累计解释方差比 (Cumulative Explained Variance Ratio):
-
构建投影矩阵 W\mathbf{W}W
- 将前 kkk 个最大特征值对应的特征向量 v1,...,vk\mathbf{v}_1, ..., \mathbf{v}_kv1,...,vk 按列组合成 m×km \times km×k 的矩阵 W\mathbf{W}W。
-
执行降维:数据投影
- 计算降维后的数据:Z=XW\mathbf{Z} = \mathbf{X} \mathbf{W}Z=XW
- Z\mathbf{Z}Z 是 n×kn \times kn×k 的矩阵,每一行是一个样本在 kkk 维主成分空间中的表示。
五、一个详细的数值例子
假设我们有3个样本,2个特征的数据:
X=[122334]\mathbf{X} = \begin{bmatrix} 1 & 2 \\ 2 & 3 \\ 3 & 4 \end{bmatrix}X=123234
-
中心化:
- 特征1均值:(1+2+3)/3=2(1+2+3)/3 = 2(1+2+3)/3=2
- 特征2均值:(2+3+4)/3=3(2+3+4)/3 = 3(2+3+4)/3=3
- 中心化后 Xcentered=[−1−10011]\mathbf{X}_{\text{centered}} = \begin{bmatrix} -1 & -1 \\ 0 & 0 \\ 1 & 1 \end{bmatrix}Xcentered=−101−101
-
计算协方差矩阵 S\mathbf{S}S:
- S=12XcenteredTXcentered=12[−101−101]T[−1−10011]\mathbf{S} = \frac{1}{2} \mathbf{X}_{\text{centered}}^T \mathbf{X}_{\text{centered}} = \frac{1}{2} \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix}^T \begin{bmatrix} -1 & -1 \\ 0 & 0 \\ 1 & 1 \end{bmatrix}S=21XcenteredTXcentered=21[−1−10011]T−101−101
- S=12[2222]=[1111]\mathbf{S} = \frac{1}{2} \begin{bmatrix} 2 & 2 \\ 2 & 2 \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}S=21[2222]=[1111]
-
求特征值和特征向量:
- 解 det(S−λI)=0\det(\mathbf{S} - \lambda\mathbf{I}) = 0det(S−λI)=0:
(1−λ)2−1=0⇒λ2−2λ=0⇒λ(λ−2)=0(1-\lambda)^2 - 1 = 0 \Rightarrow \lambda^2 - 2\lambda = 0 \Rightarrow \lambda(\lambda - 2) = 0(1−λ)2−1=0⇒λ2−2λ=0⇒λ(λ−2)=0 - 特征值:λ1=2\lambda_1 = 2λ1=2, λ2=0\lambda_2 = 0λ2=0
- λ1=2\lambda_1=2λ1=2 对应的特征向量:解 (S−2I)v=0(\mathbf{S} - 2\mathbf{I})\mathbf{v} = \mathbf{0}(S−2I)v=0 ⇒[−111−1][v1v2]=0\Rightarrow \begin{bmatrix} -1 & 1 \\ 1 & -1 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = \mathbf{0}⇒[−111−1][v1v2]=0 ⇒v1=v2\Rightarrow v_1 = v_2⇒v1=v2。单位化得 v1=[1/21/2]≈[0.7070.707]\mathbf{v}_1 = \begin{bmatrix} 1/\sqrt{2} \\ 1/\sqrt{2} \end{bmatrix} \approx \begin{bmatrix} 0.707 \\ 0.707 \end{bmatrix}v1=[1/21/2]≈[0.7070.707]
- λ2=0\lambda_2=0λ2=0 对应的特征向量:v2=[−1/21/2]≈[−0.7070.707]\mathbf{v}_2 = \begin{bmatrix} -1/\sqrt{2} \\ 1/\sqrt{2} \end{bmatrix} \approx \begin{bmatrix} -0.707 \\ 0.707 \end{bmatrix}v2=[−1/21/2]≈[−0.7070.707]
- 解 det(S−λI)=0\det(\mathbf{S} - \lambda\mathbf{I}) = 0det(S−λI)=0:
-
选择主成分:
- λ1=2\lambda_1=2λ1=2 远大于 λ2=0\lambda_2=0λ2=0,解释了100%的方差。选择 k=1k=1k=1。
-
构建投影矩阵 W\mathbf{W}W:
- W=[v1]=[0.7070.707]\mathbf{W} = \begin{bmatrix} \mathbf{v}_1 \end{bmatrix} = \begin{bmatrix} 0.707 \\ 0.707 \end{bmatrix}W=[v1]=[0.7070.707]
-
降维投影:
- Z=XcenteredW=[−1−10011][0.7070.707]=[−1.41401.414]\mathbf{Z} = \mathbf{X}_{\text{centered}} \mathbf{W} = \begin{bmatrix} -1 & -1 \\ 0 & 0 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} 0.707 \\ 0.707 \end{bmatrix} = \begin{bmatrix} -1.414 \\ 0 \\ 1.414 \end{bmatrix}Z=XcenteredW=−101−101[0.7070.707]=−1.41401.414
- 原始数据被成功降至1维。
六、PCA的优缺点
优点:
- 原理清晰,易于实现。
- 有效降低数据维度,保留主要信息。
- 主成分之间线性无关,消除了原始特征间的多重共线性。
- 有成熟的数学理论基础。
- 计算效率相对较高(对于中等维度)。
缺点:
- 线性方法: 只能捕捉线性关系,对于非线性结构(如环形、螺旋形)效果不佳。(此时可考虑t-SNE, UMAP等非线性降维方法)。
- 主成分可解释性差: 主成分是原始特征的线性组合,其物理意义可能不明确,不如原始特征直观。
- 对异常值敏感: 异常值可能显著影响协方差矩阵,从而影响主成分的方向。
- 依赖于方差: 假设方差大的方向信息量大,但这不一定总是成立。
- 全局线性: 寻找的是全局最优的线性投影,可能忽略局部结构。
七、scikit-learn中的PCA API详解
在实际应用中,我们通常使用成熟的机器学习库来实现PCA,其中 scikit-learn
的 sklearn.decomposition.PCA
是最常用的选择。下面我们详细讲解其核心参数、属性和方法。
1. 核心参数 (Parameters)
-
n_components
(int, float, str or None, default=None)- 作用: 指定要保留的主成分数量。
- 取值:
int
:直接指定数量,如n_components=2
。float
(0 < x < 1):指定希望保留的方差比例,如n_components=0.95
表示保留95%的方差。"mle"
:使用Minka’s MLE算法自动选择n_components
。None
:保留所有主成分(n_components == min(n_samples, n_features)
)。
- 注意: 当
n_components
为float
时,PCA会自动计算需要多少个主成分才能达到指定的方差比例。
-
copy
(bool, default=True)- 作用: 是否在拟合(
fit
)时复制输入数据。 - 取值:
True
:复制数据,原始数据不变。False
:不复制,直接在原始数据上操作(可能修改原始数据)。
- 建议: 通常设为
True
以保护原始数据。
- 作用: 是否在拟合(
-
whiten
(bool, default=False)- 作用: 是否对降维后的数据进行白化(Whitening)。
- 取值:
False
:不白化,主成分的方差等于对应的特征值。True
:白化,将每个主成分缩放至单位方差(即除以sqrt(特征值)
)。这使得所有主成分具有相同的方差(通常为1),在某些算法(如聚类)中可能有益,因为它消除了不同主成分的尺度差异。
- 代价: 白化会丢失一些信息(方差信息),并且可能放大噪声。
-
svd_solver
(str {‘auto’, ‘full’, ‘arpack’, ‘randomized’}, default=‘auto’)- 作用: 指定计算主成分所使用的SVD(奇异值分解)求解器。对于大型数据集,选择合适的求解器能显著提高效率。
- 取值:
'auto'
:根据数据类型和n_components
自动选择最合适的求解器。'full'
:使用标准的SVD,适合中小型数据集。'arpack'
:使用ARPACK迭代方法,适合n_components << min(n_samples, n_features)
的情况,且n_components
较小。'randomized'
:使用Halko et al.的随机SVD方法,适合非常大的数据集或n_components
较小的情况,速度很快但结果是随机的(可通过random_state
控制随机性)。
-
tol
(float, default=0.0)- 作用: SVD求解器的收敛容差。仅当
svd_solver
为'arpack'
时有效。
- 作用: SVD求解器的收敛容差。仅当
-
iterated_power
(int or ‘auto’, default=‘auto’)- 作用: 随机SVD求解器的幂迭代次数。仅当
svd_solver
为'randomized'
时有效。'auto'
通常是一个好的选择。
- 作用: 随机SVD求解器的幂迭代次数。仅当
-
random_state
(int, RandomState instance or None, default=None)- 作用: 控制随机数生成器。仅当
svd_solver
为'arpack'
或'randomized'
时有效。 - 取值:
int
:使用该整数作为随机种子,保证结果可复现。None
:使用numpy的全局随机状态。
- 作用: 控制随机数生成器。仅当
2. 重要属性 (Attributes)
在调用 fit
方法后,PCA对象会计算并存储以下属性:
-
components_
(array of shape (n_components, n_features))- 含义: 主成分(即特征向量)本身。每一行代表一个主成分,是原始特征空间中的一个方向向量。
- 用途: 理解主成分的构成(例如,哪个原始特征在某个主成分中权重最大)。
-
explained_variance_
(array of shape (n_components,))- 含义: 每个主成分所解释的方差(即对应的特征值)。
- 用途: 评估每个主成分的重要性。
-
explained_variance_ratio_
(array of shape (n_components,))- 含义: 每个主成分所解释的方差占总方差的比例。
- 用途: 这是评估降维效果最常用的指标。例如,
explained_variance_ratio_[0]
表示第一个主成分解释了多少比例的方差。
-
singular_values_
(array of shape (n_components,))- 含义: 在拟合过程中计算出的每个主成分的奇异值。注意:
explained_variance_
=(singular_values_ ** 2) / (n_samples - 1)
。
- 含义: 在拟合过程中计算出的每个主成分的奇异值。注意:
-
mean_
(array of shape (n_features,))- 含义: 训练数据在每个特征上的均值。PCA在内部会对数据进行中心化,此属性存储了用于中心化的均值。
- 用途: 如果需要对新数据进行同样的预处理(减去此均值),或者将降维后的数据重构回原始空间时需要使用。
-
n_components_
(int)- 含义: 实际保留的主成分数量。
-
n_features_
(int)- 含义: 训练数据的特征数量。
-
n_samples_
(int)- 含义: 训练数据的样本数量。
3. 核心方法 (Methods)
-
fit(X[, y])
- 作用: 根据训练数据
X
计算PCA模型(即计算主成分、方差等)。 - 参数:
X
(array-like of shape (n_samples, n_features)):训练数据。 - 返回: 返回拟合好的PCA对象本身。
- 作用: 根据训练数据
-
transform(X)
- 作用: 将数据
X
投影到主成分空间,得到降维后的数据。 - 参数:
X
(array-like of shape (n_samples, n_features)):需要转换的数据。注意:X
会自动减去mean_
进行中心化。 - 返回:
X_transformed
(array of shape (n_samples, n_components)):降维后的数据。
- 作用: 将数据
-
fit_transform(X[, y])
- 作用: 先调用
fit
,然后调用transform
。这是最常用的组合方法。 - 参数:
X
(array-like of shape (n_samples, n_features))。 - 返回:
X_transformed
(array of shape (n_samples, n_components))。
- 作用: 先调用
-
inverse_transform(X)
- 作用: 将降维后的数据
X
从主成分空间重构回原始特征空间。 - 参数:
X
(array-like of shape (n_samples, n_components)):降维后的数据。 - 返回:
X_original
(array of shape (n_samples, n_features)):重构后的数据。注意: 由于降维丢失了信息,重构的数据通常不等于原始数据,它们之间的差异就是重构误差。
- 作用: 将降维后的数据
-
get_covariance()
- 作用: 基于主成分和方差,估计重构的协方差矩阵。
-
get_precision()
- 作用: 估计协方差矩阵的逆(精度矩阵)。
4. 使用示例
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt# 1. 准备数据
# 假设有原始数据 X (n_samples x n_features)
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) # 示例数据# 2. 数据预处理:标准化 (非常重要!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # fit_transform 计算均值和标准差并转换# 3. 创建并拟合PCA模型
# 方式一:指定主成分数量
pca = PCA(n_components=2) # 保留2个主成分
X_pca = pca.fit_transform(X_scaled) # fit + transform# 方式二:指定方差比例
# pca = PCA(n_components=0.95)
# X_pca = pca.fit_transform(X_scaled)# 4. 查看结果
print("主成分 (components_):\n", pca.components_)
print("各主成分解释方差:", pca.explained_variance_)
print("各主成分解释方差比例:", pca.explained_variance_ratio_)
print("累计解释方差比例:", np.cumsum(pca.explained_variance_ratio_))
print("降维后数据:\n", X_pca)# 5. 可视化 (2D降维)
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1])
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.title('PCA Result')
plt.grid(True)
plt.show()# 6. 重构数据 (可选)
X_pca_reduced = X_pca[:, :1] # 如果只用了第一个主成分
X_reconstructed_scaled = pca.inverse_transform(X_pca_reduced) # 重构回标准化空间
X_reconstructed = scaler.inverse_transform(X_reconstructed_scaled) # 反标准化回原始空间
print("原始数据:\n", X)
print("重构数据:\n", X_reconstructed)
运行结果:
主成分 (components_):[[-0.70710678 -0.70710678][-0.70710678 0.70710678]]
各主成分解释方差: [2.50000000e+00 9.24446373e-33]
各主成分解释方差比例: [1.00000000e+00 3.69778549e-33]
累计解释方差比例: [1. 1.]
降维后数据:[[ 2.00000000e+00 1.48952049e-16][ 1.00000000e+00 -4.96506831e-17][-0.00000000e+00 0.00000000e+00][-1.00000000e+00 4.96506831e-17][-2.00000000e+00 9.93013661e-17]]