当前位置: 首页 > 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.dtcms.com/a/297028.html

相关文章:

  • 学着学着 我就给这个 HarmonyOS 应用增加了些新技术
  • 读书笔记(黄帝内经)
  • Lua(迭代器)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(二)
  • 实战演练11:生成式对话机器人(Bloom)
  • 硅基计划3.0 学习总结 叁 栈和队列 初版
  • 贪心算法Day6学习心得
  • 硬件基础 -- PLL锁相环
  • 从模型选型到实践的全景指南
  • 基于arduino uno r3主控的环境监测系统设计-2
  • PCL 间接平差拟合球
  • 跨境支付入门~国际支付结算(电商篇)
  • 用Python玩转数据:Pandas库实战指南(二)
  • AudioLLM 开源项目了解学习
  • 【0基础PS】PS(Photoshop)与Ai( Illustrator )等相似软件区别
  • Java并发编程第八篇(CountDownLatch组件分析)
  • 在线工具+网页平台来学习和操作Python与Excel相关技能
  • 「Linux命令基础」查看用户和用户组状态
  • 基于arduino uno r3主控的环境监测系统设计-1
  • MySQL八股篇
  • Task 02: 深入理解MARL
  • WPF基础内容记录
  • RPG65. 制作死亡画面(一):制作ui
  • OSPF路由协议(单区域)
  • 解决 SQL 错误 [1055]:深入理解 only_full_group_by 模式下的查询规范
  • ddos 放在多个云主机,同时运行
  • 计算机网络知识点总结 (1)
  • Web前端:JavaScript indexOf()方法
  • 腾势N9再进化:智能加buff,豪华更对味
  • 无线通信资源分配相关算法