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

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.xdnf.cn/news/16173.html

相关文章:

  • Python Day15 面向对象核心特性笔记 及 例题分析
  • 数组toString方法及类型检测修复方案
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍
  • 同花顺前端潜在面试题目与答案
  • 星慈光编程虫2号小车讲解第一篇--向前向后
  • 力扣1287:有序数组中出现次数超过25%的元素
  • 背包DP之分组背包
  • 嵌入式通信知识串讲:从同步 / 异步传输到 UART 协议 STM32F103 硬件解析
  • ​Excel——SUMPRODUCT 函数
  • 基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践
  • PCL 间接平差拟合球
  • 基于20和28 nm FPGAs的实现多通道、低非线性时间到数字转换器
  • 变量和函数底层工作原理
  • T-RO顶刊|单视角“找相似”,大阪大学提出新型点云描述符(C-FPFH),杂乱场景一抓一个准!
  • 0724 双向链表
  • C语言(十)
  • 移动端自动化Appium框架
  • 清除浮动以及原理
  • 2025年6月GESP(C++六级):学习小组
  • wiz2025 挑战赛从 SpringActuator 泄露到 s3 敏感文件获取全解析
  • Linux驱动19 --- FFMPEG
  • 7.3.2 内核内存管理运行机制
  • Lua(迭代器)
  • 现代C++的一般编程规范
  • 论文阅读:《针对多目标优化和应用的 NSGA-II 综述》一些关于优化算法的简介
  • Python生成折线图
  • 二、计算机网络技术——第6章:应用层
  • matrix-breakout-2-morpheus靶场通过
  • 详解FreeRTOS开发过程(五)-- 系统内核控制函数及任务相关API函数