前置知识点:SVD(Singular Value Decomposition)
定义
假设x = ( x 1 , x 2 , … , x m ) T x = (x_{1},x_{2},\dots,x_{m})^T x = ( x 1 , x 2 , … , x m ) T 是m m m 维随机变量,其均值变量是μ \mu μ ,协方差矩阵是Σ \Sigma Σ ,考虑到由m m m 维随机变量x x x 到由m m m 维随机变量y y y 的线性变换:
y i = α i T x = α 1 i x 1 + ⋯ + α m i x m \begin{align}
y_{i} = \alpha_{i}^T x = \alpha_{1i}x_{1} + \cdots + \alpha_{mi}x_{m}
\end{align}
y i = α i T x = α 1 i x 1 + ⋯ + α mi x m
由随机变量的性质:
E ( y i ) = α i T μ v a r ( y i ) = α i T Σ α i c o v ( y i , y j ) = α i T Σ α j \begin{align}
& E(y_{i}) = \alpha_{i}^T \mu \\
& \mathrm{var}(y_{i}) = \alpha_{i}^T \Sigma \alpha_{i} \\
& \mathrm{cov}(y_{i},y_{j}) = \alpha_{i}^T \Sigma \alpha_{j}
\end{align}
E ( y i ) = α i T μ var ( y i ) = α i T Σ α i cov ( y i , y j ) = α i T Σ α j
总体主成分分析
给定一个如式(1)所示的线性变换,如果他们满足以下条件:
系数变量α i T \alpha_{i}^T α i T 是单位向量,即α i T α i = 1 \boldsymbol{\alpha_{i}^T \alpha_{i}} = 1 α i T α i = 1
c o v ( y i , y j ) = 0 \mathrm{cov}(y_{i},y_{j}) = 0 cov ( y i , y j ) = 0
变量 y 1 y_{1} y 1 是 x \boldsymbol{x} x 的所有线性变换中方差最大的;y 2 y_{2} y 2 是与 y 1 y_{1} y 1 不相关的 x \boldsymbol{x} x 的所有线性变换中方差最大的;一般地,y i y_{i} y i 是与 y 1 , y 2 , ⋯ , y i − 1 ( i = 1 , 2 , ⋯ , m ) y_{1}, y_{2}, \cdots, y_{i-1}(i=1,2, \cdots, m) y 1 , y 2 , ⋯ , y i − 1 ( i = 1 , 2 , ⋯ , m ) 都不相关的 x \boldsymbol{x} x 的所有线性变换中方差最大的,这时分别称 y 1 , y 2 , ⋯ , y m y_{1}, y_{2}, \cdots, y_{m} y 1 , y 2 , ⋯ , y m 为 x \boldsymbol{x} x 的第一主成分,第二主成分,⋯ ⋯ \cdots\cdots ⋯⋯ ,第 m m m 主成分。
样本主成分分析
一般的,样本第i i i 主成分y i = α i T x y_{i} = \boldsymbol{\alpha_{i}^T x} y i = α i T x 是在a i T a i = 1 \boldsymbol{a}_{i}^{\mathrm{T}} \boldsymbol{a}_{i}=1 a i T a i = 1 和a i T x j \boldsymbol{a}_{i}^{\mathrm{T}} \boldsymbol{x}_{j} a i T x j 与a k T x j ( k < i , j = 1 , 2 , ⋯ , n ) \boldsymbol{a}_{k}^{\mathrm{T}} \boldsymbol{x}_{j}(k<i, j=1,2, \cdots, n) a k T x j ( k < i , j = 1 , 2 , ⋯ , n ) 的样本协方差a k T S a i = 0 \boldsymbol{a}_{k}^{\mathrm{T}} \boldsymbol{S} \boldsymbol{a}_{i}=0 a k T S a i = 0 条件下,使a i T x j ( j = 1 , 2 , ⋯ , n ) \boldsymbol{a}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}(j=1,2, \cdots, n) a i T x j ( j = 1 , 2 , ⋯ , n ) 的样本方差a i T S a i \boldsymbol{a}_{i}^{\mathrm{T}} \boldsymbol{S} \boldsymbol{a}_{i} a i T S a i 最大的x \boldsymbol{x} x 的线性变换。
样本主成分分析与总体主成分分析具有相同的性质。样本协方差矩阵S \boldsymbol{S} S 是总体协方差矩阵Σ \boldsymbol{\Sigma} Σ 的无偏估计,样本相关矩阵R \boldsymbol{R} R 是总体相关矩阵的无偏估计,S \boldsymbol{S} S 的特征值和特征向量是Σ \boldsymbol{\Sigma} Σ 的特征值和特征向量的最大似然估计。
主成分分析的计算及应用
主成分分析的计算
m m m 维随机变量y = ( y 1 , y 2 , ⋯ , y m ) \boldsymbol{y} = (y_{1},y_{2},\cdots,y_{m}) y = ( y 1 , y 2 , ⋯ , y m ) 的分量依次是x \boldsymbol{x} x 的第一主成分到第m m m 主成分的充要条件是:
y = A T x \boldsymbol{y = A^T x} y = A T x ,A \boldsymbol{A} A 是正交矩阵:
[ α 11 α 12 ⋯ α 1 m α 21 α 22 ⋯ α 2 m ⋮ ⋮ ⋮ α m 1 α m 2 ⋯ α m m ] \left[
\begin{matrix}
\alpha_{11} & \alpha_{12} & \cdots &\alpha_{1m} \\
\alpha_{21} & \alpha_{22} & \cdots &\alpha_{2m} \\
\vdots & \vdots & & \vdots \\
\alpha_{m1} & \alpha_{m2} & \cdots &\alpha_{mm} \\
\end{matrix}
\right] α 11 α 21 ⋮ α m 1 α 12 α 22 ⋮ α m 2 ⋯ ⋯ ⋯ α 1 m α 2 m ⋮ α mm
y \boldsymbol{y} y 的协方差矩阵为对角矩阵:
c o v ( y ) = d i a g ( λ 1 , λ 2 , ⋯ , λ m ) λ 1 ≥ λ 2 ≥ ⋯ ≥ λ m \begin{align}
&\mathrm{cov}(\boldsymbol{y}) = \mathrm{diag}(\lambda_{1},\lambda_{2},\cdots,\lambda_{m}) \\
&\lambda_{1} \geq \lambda_{2} \geq \cdots \geq \lambda_{m}\\
\end{align}
cov ( y ) = diag ( λ 1 , λ 2 , ⋯ , λ m ) λ 1 ≥ λ 2 ≥ ⋯ ≥ λ m
其中,λ k \lambda_{k} λ k 是Σ \boldsymbol{\Sigma} Σ 的第k k k 个特征值,α k \alpha_{k} α k 是对应的单位特征向量,k = 1 , 2 , ⋯ , m k = 1,2,\cdots,m k = 1 , 2 , ⋯ , m ,用矩阵可以表示为:
Σ A = A Λ \begin{align}
&\boldsymbol{\Sigma A = A \Lambda}
\end{align}
Σ A = A Λ
主成分的个数
对于任意正整数 q , 1 ≤ q ≤ m q, 1 \leq q \leq m q , 1 ≤ q ≤ m ,考虑正交线性变换
y = B T x \begin{align}
\boldsymbol{y = B^T x}
\end{align}
y = B T x
其中,y \boldsymbol{y} y 是 q q q 维向量,B T \boldsymbol{B^T} B T 是 q × m q \times m q × m 矩阵,令y \boldsymbol{y} y 的协方差矩阵为
Σ y = B T Σ B \begin{align}
\boldsymbol{\Sigma_y = B^T \Sigma B}
\end{align}
Σ y = B T Σ B
则 Σ y \boldsymbol{\Sigma_y} Σ y 的迹 t r ( Σ y ) \mathrm{tr}(\boldsymbol{\Sigma_y}) tr ( Σ y ) 在 B = A q \boldsymbol{B = A_q} B = A q 时取得最大值,其中矩阵 A q \boldsymbol{A_q} A q 由正交矩阵 A \boldsymbol{A} A 的前 q q q 列组成。
主成分的方差贡献率
第 k k k 主成分 y k y_{k} y k 的方差贡献率定义为 y k y_{k} y k 的方差与所有方差之和的比,记作 η k \eta_k η k :
η k = λ k ∑ i = 1 m λ i \begin{align}
\eta_k = \frac{\lambda_k}{\sum_{i=1}^{m} \lambda_i}
\end{align}
η k = ∑ i = 1 m λ i λ k
对于主成分 y 1 , y 2 , ⋯ , y k y_1, y_2, \cdots, y_k y 1 , y 2 , ⋯ , y k ,其累计方差贡献率定义为从方差之和和所有方差之和的比:
η k = ∑ i = 1 k λ i ∑ i = 1 m λ i \begin{align}
\eta_k = \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{m} \lambda_i}
\end{align}
η k = ∑ i = 1 m λ i ∑ i = 1 k λ i
通常取 k k k 使得累计方差贡献率达到规定的百分比以上,如 70%~80% 以上。累计方差贡献率反映了主成分保留的信息比例,但它不能反映对某个原有变量 x i x_i x i 保留信息的比例,这时可以通过主成分 y 1 , y 2 , ⋯ , y k y_1, y_2, \cdots, y_k y 1 , y 2 , ⋯ , y k 对原变量 x i x_i x i 的贡献率。
主成分对原有变量的贡献率
第 k k k 主成分 y 1 , y 2 , ⋯ , y k y_1, y_2, \cdots, y_k y 1 , y 2 , ⋯ , y k 对原变量的贡献率与 ( x 1 , x 2 , ⋯ , x k ) (x_1, x_2, \cdots, x_k) ( x 1 , x 2 , ⋯ , x k ) 的相关系数的平方,记作:
v i = ρ 2 ( x i , y 1 , y 2 , ⋯ , y k ) \begin{align}
v_i = \rho^2 (x_i, y_1, y_2, \cdots, y_k)
\end{align}
v i = ρ 2 ( x i , y 1 , y 2 , ⋯ , y k )
计算公式如下:
v i = ρ 2 ( x i , y 1 , y 2 , ⋯ , y k ) = ∑ j = 1 k ρ 2 ( x i , y j ) = ∑ j = 1 k λ j Q i j 2 \begin{align}
v_i = \rho^2 (x_i, y_1, y_2, \cdots, y_k) = \sum_{j=1}^{k} \rho^2 (x_i, y_j) = \sum_{j=1}^{k} \lambda_j Q_{ij}^2
\end{align}
v i = ρ 2 ( x i , y 1 , y 2 , ⋯ , y k ) = j = 1 ∑ k ρ 2 ( x i , y j ) = j = 1 ∑ k λ j Q ij 2
主成分分析结果解读
本部分摘自什么是主成分分析 (PCA)?
主成分分析 (PCA) 图是使用前两个主成分作为轴创建的散点图。x 轴为第一主成分 (PC1),y 轴为第二主成分 (PC2)。散点图显示了观测值(数据点)和新变量(主成分)之间的关系。每个点的位置显示该观测的 PC1 和 PC2 值。
绘图箭头的方向和长度指示变量的载荷,即每个变量对主成分的贡献。如果一个变量对于特定成分具有高载荷,则它与该成分具有强相关性。这可以突出显示哪些变量对数据变化有重大影响。
应用主成分分析 (PCA) 后剩余的主成分数量可帮助解释数据输出。第一个主成分解释最大的数据方差,后面每个成分解释更小的方差。因此,成分的数量可以表示从原始数据集中保留的信息量。应用主成分分析 (PCA) 后,成分越少可能意味着您没有捕捉到太多的数据变化。成分越多表示数据变化越多,但结果可能更难解释。您可以使用碎石图或累积解释方差来确定要保留成分的最优数量。
主成分分析实战——以MNIST数据集为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import matplotlib.pyplot as pltfrom sklearn.decomposition import PCAfrom sklearn.datasets import fetch_openmlfrom sklearn.preprocessing import StandardScalermnist = fetch_openml("mnist_784" ) X, y = mnist["data" ], mnist["target" ].astype(int ) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) n_components = 5 for label in range (10 ): plt.figure(figsize=(8 , 6 )) label_data = X_scaled[y == label] pca_label = PCA(n_components=n_components) pca_label.fit(label_data) for i in range (n_components): plt.subplot(1 , n_components, i+1 ) plt.imshow(pca_label.components_[i].reshape(28 , 28 ), cmap='gray' ) plt.title(f'PC {i+1 } for label {label} ' ) plt.axis('off' ) plt.show()
生成的图像如下(仅显示标签为0,标签为1的主成分):