Day 20:奇异值SVD分解

Review

上一节主要学习了几种特征选择的具体方法,包含:

  • 方差筛选
  • 皮尔逊相关系数筛选
  • lasso筛选
  • 树模型重要性
  • SHAP重要性
  • 递归特征消除REF

其目的是为了从大量的特征中选择有效的的特征,去除冗余甚至是噪声的非必要特征,从而构建出高质量的数据集。


Today

今天由矩阵的SVD分解讲起,并引申到实际的数据处理应用中。

SVD

SVD(奇异值分解)是线性代数中的一个矩阵分解技术。
对于任意实数矩阵 A ∈ R m × n A∈R^{m×n} ARm×n, A ∈ R m × n A ∈ R m × n A \in \mathbb{R}^{m \times n} A∈R^{m×n} ARm×nARm×n,SVD将其分解为:
A = U Σ V T A=UΣV^T A=UΣVT

其中:

  • U ∈ R m × m U \in \mathbb{R}^{m \times m} URm×m左奇异向量矩阵(正交矩阵)
  • Σ ∈ R m × n \Sigma \in \mathbb{R}^{m \times n} ΣRm×n奇异值矩阵(对角矩阵)
  • V ∈ R n × n V \in \mathbb{R}^{n \times n} VRn×n右奇异向量矩阵(正交矩阵)

组成要素详解

1. 奇异值(Singular Values)

  • σ 1 ≥ σ 2 ≥ . . . ≥ σ r ≥ 0 \sigma_1 \geq \sigma_2 \geq ... \geq \sigma_r \geq 0 σ1σ2...σr0
  • r = rank ( A ) r = \text{rank}(A) r=rank(A) 是矩阵A的秩
  • 非零奇异值的个数等于矩阵的秩

2. 左奇异向量(Left Singular Vectors)

  • U U U 的列向量: { u 1 , u 2 , . . . , u m } \{u_1, u_2, ..., u_m\} {u1,u2,...,um}
  • 满足 U T U = I m U^TU = I_m UTU=Im(正交性)
  • 张成矩阵A的列空间和左零空间

3. 右奇异向量(Right Singular Vectors)

  • V V V 的列向量: { v 1 , v 2 , . . . , v n } \{v_1, v_2, ..., v_n\} {v1,v2,...,vn}
  • 满足 V T V = I n V^TV = I_n VTV=In(正交性)
  • 张成矩阵A的行空间和零空间

计算方法

方法一:通过特征值分解

  1. 计算 A T A A^TA ATA 的特征值分解: A T A = V Λ V T A^TA = V\Lambda V^T ATA=VΛVT
  2. 奇异值: σ i = λ i \sigma_i = \sqrt{\lambda_i} σi=λi
  3. 右奇异向量: V V V 的特征向量
  4. 左奇异向量: u i = 1 σ i A v i u_i = \frac{1}{\sigma_i}Av_i ui=σi1Avi

方法二:双边对角化

  • 使用Householder变换或Givens旋转
  • 逐步将矩阵化为双对角形式
  • 再对双对角矩阵进行SVD

几何意义

SVD描述了线性变换的几何结构

输入空间 --[V^T]--> 标准正交基 --[Σ]--> 缩放变换 --[U]--> 输出空间
  • V T V^T VT:输入空间的旋转/反射
  • Σ \Sigma Σ:沿坐标轴的缩放
  • U U U:输出空间的旋转/反射

重要性质

1. 存在性与唯一性

  • 任意矩阵都存在SVD分解
  • 奇异值唯一确定(按降序排列)
  • 奇异向量在奇异值不重复时唯一

2. 降维表示
A = ∑ i = 1 r σ i u i v i T A = \sum_{i=1}^{r} \sigma_i u_i v_i^T A=i=1rσiuiviT

3. 最优逼近性

  • 截断SVD提供最优的低秩逼近
  • A k = ∑ i = 1 k σ i u i v i T A_k = \sum_{i=1}^{k} \sigma_i u_i v_i^T Ak=i=1kσiuiviT 是秩为k的最佳逼近

4. 范数关系

  • Frobenius范数: ∥ A ∥ F = ∑ i = 1 r σ i 2 \|A\|_F = \sqrt{\sum_{i=1}^{r} \sigma_i^2} AF=i=1rσi2
  • 谱范数: ∥ A ∥ 2 = σ 1 \|A\|_2 = \sigma_1 A2=σ1

主要应用领域

1. 数据科学

  • 主成分分析(PCA):降维和特征提取
  • 推荐系统:矩阵分解和协同过滤
  • 图像压缩:低秩逼近减少存储

2. 机器学习

  • 潜在语义分析(LSA):文本挖掘
  • 正则化:解决过拟合问题
  • 特征选择:识别重要特征维度

3. 数值计算

  • 线性方程组求解:处理病态矩阵
  • 伪逆计算 A + = V Σ + U T A^+ = V\Sigma^+U^T A+=VΣ+UT
  • 矩阵条件数 κ ( A ) = σ 1 σ r \kappa(A) = \frac{\sigma_1}{\sigma_r} κ(A)=σrσ1

4. 信号处理

  • 噪声降低:保留主要奇异值
  • 信号重构:从不完整数据恢复
  • 频谱分析:识别主要频率成分

计算复杂度

  • 标准算法 O ( min ⁡ ( m n 2 , m 2 n ) ) O(\min(mn^2, m^2n)) O(min(mn2,m2n))
  • 随机算法 O ( m n k ) O(mnk) O(mnk)(k为目标秩)
  • 稀疏矩阵:利用稀疏性可显著加速

SVD是线性代数的核心工具,它揭示了矩阵的内在几何结构,在理论研究和实际应用中都具有fundamental重要性。



import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 设置随机种子以便结果可重复
np.random.seed(42)

# 模拟数据:1000 个样本,50 个特征
n_samples = 1000
n_features = 50
X = np.random.randn(n_samples, n_features) * 10  # 随机生成特征数据
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 模拟二分类标签

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"训练集形状: {X_train.shape}")
print(f"测试集形状: {X_test.shape}")

# 对训练集进行 SVD 分解
U_train, sigma_train, Vt_train = np.linalg.svd(X_train, full_matrices=False)
print(f"Vt_train 矩阵形状: {Vt_train.shape}")

# 选择保留的奇异值数量 k
k = 10
Vt_k = Vt_train[:k, :]  # 保留前 k 行,形状为 (k, 50)
print(f"保留 k={k} 后的 Vt_k 矩阵形状: {Vt_k.shape}")

# 降维训练集:X_train_reduced = X_train @ Vt_k.T
X_train_reduced = X_train @ Vt_k.T
print(f"降维后训练集形状: {X_train_reduced.shape}")

# 使用相同的 Vt_k 对测试集进行降维:X_test_reduced = X_test @ Vt_k.T
X_test_reduced = X_test @ Vt_k.T
print(f"降维后测试集形状: {X_test_reduced.shape}")

# 训练模型(以逻辑回归为例)
model = LogisticRegression(random_state=42)
model.fit(X_train_reduced, y_train)

# 预测并评估
y_pred = model.predict(X_test_reduced)
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {accuracy}")

# 计算训练集的近似误差(可选,仅用于评估降维效果)
X_train_approx = U_train[:, :k] @ np.diag(sigma_train[:k]) @ Vt_k
error = np.linalg.norm(X_train - X_train_approx, 'fro') / np.linalg.norm(X_train, 'fro')
print(f"训练集近似误差 (Frobenius 范数相对误差): {error}")

@浙大疏锦行

你可能感兴趣的:(Day 20:奇异值SVD分解)