Day 20:奇异值SVD分解
Review
上一节主要学习了几种特征选择的具体方法,包含:
- 方差筛选
- 皮尔逊相关系数筛选
- lasso筛选
- 树模型重要性
- SHAP重要性
- 递归特征消除REF
其目的是为了从大量的特征中选择有效的的特征,去除冗余甚至是噪声的非必要特征,从而构建出高质量的数据集。
Today
今天由矩阵的SVD分解讲起,并引申到实际的数据处理应用中。
SVD
SVD(奇异值分解)是线性代数中的一个矩阵分解技术。
对于任意实数矩阵 A∈Rm×nA∈R^{m×n}A∈Rm×n, A∈Rm×nA∈Rm×nA \in \mathbb{R}^{m \times n} A∈R^{m×n}A∈Rm×nA∈Rm×n,SVD将其分解为:
A=UΣVTA=UΣV^TA=UΣVT
其中:
- U∈Rm×mU \in \mathbb{R}^{m \times m}U∈Rm×m 是左奇异向量矩阵(正交矩阵)
- Σ∈Rm×n\Sigma \in \mathbb{R}^{m \times n}Σ∈Rm×n 是奇异值矩阵(对角矩阵)
- V∈Rn×nV \in \mathbb{R}^{n \times n}V∈Rn×n 是右奇异向量矩阵(正交矩阵)
组成要素详解
1. 奇异值(Singular Values)
- σ1≥σ2≥...≥σr≥0\sigma_1 \geq \sigma_2 \geq ... \geq \sigma_r \geq 0σ1≥σ2≥...≥σr≥0
- r=rank(A)r = \text{rank}(A)r=rank(A) 是矩阵A的秩
- 非零奇异值的个数等于矩阵的秩
2. 左奇异向量(Left Singular Vectors)
- UUU 的列向量:{u1,u2,...,um}\{u_1, u_2, ..., u_m\}{u1,u2,...,um}
- 满足 UTU=ImU^TU = I_mUTU=Im(正交性)
- 张成矩阵A的列空间和左零空间
3. 右奇异向量(Right Singular Vectors)
- VVV 的列向量:{v1,v2,...,vn}\{v_1, v_2, ..., v_n\}{v1,v2,...,vn}
- 满足 VTV=InV^TV = I_nVTV=In(正交性)
- 张成矩阵A的行空间和零空间
计算方法
方法一:通过特征值分解
- 计算 ATAA^TAATA 的特征值分解:ATA=VΛVTA^TA = V\Lambda V^TATA=VΛVT
- 奇异值:σi=λi\sigma_i = \sqrt{\lambda_i}σi=λi
- 右奇异向量:VVV 的特征向量
- 左奇异向量:ui=1σiAviu_i = \frac{1}{\sigma_i}Av_iui=σi1Avi
方法二:双边对角化
- 使用Householder变换或Givens旋转
- 逐步将矩阵化为双对角形式
- 再对双对角矩阵进行SVD
几何意义
SVD描述了线性变换的几何结构:
输入空间 --[V^T]--> 标准正交基 --[Σ]--> 缩放变换 --[U]--> 输出空间
- VTV^TVT:输入空间的旋转/反射
- Σ\SigmaΣ:沿坐标轴的缩放
- UUU:输出空间的旋转/反射
重要性质
1. 存在性与唯一性
- 任意矩阵都存在SVD分解
- 奇异值唯一确定(按降序排列)
- 奇异向量在奇异值不重复时唯一
2. 降维表示
A=∑i=1rσiuiviTA = \sum_{i=1}^{r} \sigma_i u_i v_i^TA=i=1∑rσiuiviT
3. 最优逼近性
- 截断SVD提供最优的低秩逼近
- Ak=∑i=1kσiuiviTA_k = \sum_{i=1}^{k} \sigma_i u_i v_i^TAk=∑i=1kσiuiviT 是秩为k的最佳逼近
4. 范数关系
- Frobenius范数:∥A∥F=∑i=1rσi2\|A\|_F = \sqrt{\sum_{i=1}^{r} \sigma_i^2}∥A∥F=∑i=1rσi2
- 谱范数:∥A∥2=σ1\|A\|_2 = \sigma_1∥A∥2=σ1
主要应用领域
1. 数据科学
- 主成分分析(PCA):降维和特征提取
- 推荐系统:矩阵分解和协同过滤
- 图像压缩:低秩逼近减少存储
2. 机器学习
- 潜在语义分析(LSA):文本挖掘
- 正则化:解决过拟合问题
- 特征选择:识别重要特征维度
3. 数值计算
- 线性方程组求解:处理病态矩阵
- 伪逆计算:A+=VΣ+UTA^+ = V\Sigma^+U^TA+=VΣ+UT
- 矩阵条件数:κ(A)=σ1σr\kappa(A) = \frac{\sigma_1}{\sigma_r}κ(A)=σrσ1
4. 信号处理
- 噪声降低:保留主要奇异值
- 信号重构:从不完整数据恢复
- 频谱分析:识别主要频率成分
计算复杂度
- 标准算法:O(min(mn2,m2n))O(\min(mn^2, m^2n))O(min(mn2,m2n))
- 随机算法:O(mnk)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}")
@浙大疏锦行