当前位置: 首页 > news >正文

Day 20:奇异值SVD分解

Review

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

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

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


Today

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

SVD

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

其中:

  • U∈Rm×mU \in \mathbb{R}^{m \times m}URm×m左奇异向量矩阵(正交矩阵)
  • Σ∈Rm×n\Sigma \in \mathbb{R}^{m \times n}ΣRm×n奇异值矩阵(对角矩阵)
  • V∈Rn×nV \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)

  • 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的行空间和零空间

计算方法

方法一:通过特征值分解

  1. 计算 ATAA^TAATA 的特征值分解:ATA=VΛVTA^TA = V\Lambda V^TATA=VΛVT
  2. 奇异值:σi=λi\sigma_i = \sqrt{\lambda_i}σi=λi
  3. 右奇异向量:VVV 的特征向量
  4. 左奇异向量: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=1rσ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}AF=i=1rσi2
  • 谱范数:∥A∥2=σ1\|A\|_2 = \sigma_1A2=σ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}")

@浙大疏锦行

http://www.lryc.cn/news/598274.html

相关文章:

  • 第四章自定义编辑器窗口_创建and打开and自定义窗口(3/11)
  • vue3升级了哪些重要功能
  • 边缘计算场景的轻量化实践_将 Nginx 打包为便携式 AppImage
  • 从提示词,工具,上下文管理三个角度看OpenManus
  • 嵌入式学习-(李宏毅)机器学习(2)-day29
  • go语言基础教程:【1】基础语法:变量
  • Spring Cloud OpenFeign 常用注解_笔记
  • 在 Alpine Linux 中创建虚拟机时 Cgroup 挂在失败的现象
  • 弧焊机器人减少气体消耗攻略
  • SSL 证书与 HTTPS 的关系:一文理清核心关联
  • 离线环境下如何优雅地部署 Mentor Questa
  • Mysql命令show processlist
  • OpenCV —— color_matrix_numpy_mat_reshape
  • 嵌入式Linux:线程的创建、终止、回收、取消和分离
  • C# system.diagnostics.debug.writeline 不在输出窗口显示
  • 测试学习之——Pytest Day5
  • Java泛型初始化ArrayList<String>()和ArrayList<>()的区别
  • 【C++】简单学——list类
  • HTTP和HTTPS复习
  • Ethereum: 从零到一为DApp开发搭建专属的私有测试网络
  • USRP X440
  • LeetCode 10:正则表达式匹配
  • Python:开启机器学习的魔法之门
  • 无源域自适应综合研究【2】
  • Android Telephony UrspRule 介绍
  • EVAL长度限制突破方法
  • C#_定时器_解析
  • Flink-1.19.0源码详解7-Flink集群端调度
  • ubuntu安装teams解决方法
  • 大模型回复数据标注优化方案