主成分分析(PCA)附Python实现

主成分分析

    • 矩阵分解
      • 特征值和特征向量
      • 特征值分解
      • 奇异值分解
    • 主成分分析(PCA)
    • Python 实现

主成分分析方法(Principal Component Analysis,PCA)是一种常用的数据分析方法。PCA 通过线性变换将原始数据变换为一组各维度线性无关的表示,将多个变量压缩为少数几个综合指标(称为主成分),是一种使用最广泛的数据降维算法。

此外,由于主成分分析独特的性质,压缩之后的主成分之间线性无关,因此主成分分析也可以用在回归分析中消除多重共线性。

更多算法请见这里:2024 数学建模国赛 C 题攻略(无废话版)

矩阵分解

特征值和特征向量

介绍主成分析分析要从特征值和特征向量开始。特征值和特征向量是线性代数中两个重要的概念,用于描述矩阵在变换中的特性。给定一个 n × n n\times n n×n 的方阵 A A A ,如果存在一个非零向量 x x x 和一个标量 λ \lambda λ,使得:

A x = λ x Ax = \lambda x Ax=λx

那么 λ \lambda λ 就是矩阵 A A A 的特征值, x x x 是对应的特征向量。其中,矩阵 A A A 与向量 x x x 相乘,本质上是对向量进行了一次线性变换(旋转或拉伸),而他产生的效果与 λ x \lambda x λx 相同,说明这个线性变换就是拉伸,而非旋转。所以求特征值和特征向量的过程就是找到矩阵 A A A 能使哪些向量(特征向量)只发生伸缩变换,而变换的程度可以用特征值 λ \lambda λ 表示。

求解特征值和特征向量的步骤这里略过。

特征值分解

对于矩阵 A A A,有一组特征向量 x x x,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵 A A A 分解为如下式:

A = Q Σ Q T = ∑ j = 1 n λ j x j x j T A=Q\Sigma Q^T=\sum_{j=1}^{n} \lambda_{j}x_{j}x_{j}^{T} A=QΣQT=j=1nλjxjxjT

其中, W W W 是矩阵 A A A 的特征向量组成的矩阵, ∑ \sum 则是一个对角阵,对角线上的元素就是特征值。由矩阵分解的公式可知, A A A 值主要由较大特征值及其对应的特征向量决定。如果特征值之间差距较大,则上述公式可以近似地将较小的 λ j \lambda_j λj 替换成 0.

奇异值分解

上述所有推导都是针对方阵。对于非方阵,可以使用奇异值分解(Singular Value Decomposition,SVD)。对于非方阵 A A A,可用如下公式进行分解:
A = U Σ V T A=U\Sigma V^T A=UΣVT
其中 A A A是一个 m × n m\times n m×n的矩阵, U U U V V V是由标准正交向量构成的 m m m阶和 n n n阶方阵, Σ \Sigma Σ是一个 m × n m\times n m×n​的对角矩阵。奇异值相当于方阵中的特征值,奇异值分解相当于方阵中的特征值分解。

主成分分析(PCA)

基于以上推导,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的 k 个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

Python 实现

import numpy as np
from sklearn.decomposition import PCA

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)

print(pca.explained_variance_ratio_)
print(pca.singular_values_)

你可能感兴趣的:(数学建模,数学建模,python,算法)