day 20 奇异值SVD分解

一、什么是奇异值

 二、核心思想:

三、奇异值的主要应用

1、降维:


2、数据压缩:

原理:图像可以表示为一个矩阵,矩阵的元素对应图像的像素值。对这个图像矩阵进行 SVD 分解后,小的奇异值对图像的主要结构贡献很小,它们往往对应于图像中的细节和噪声。通过丢弃这些小的奇异值,只保留较大的奇异值及其对应的列向量,再用保留的部分重建图像矩阵,就可以在尽量保持图像主要内容的同时,大幅减少存储图像所需的数据量。

3、去噪:

在很多实际数据中,噪声往往表现为在各个方向上的微小干扰,反映在奇异值上就是一些较小的奇异值。通过丢弃这些小的奇异值及其对应的奇异向量,然后用剩下的较大奇异值部分重建数据矩阵,就可以有效地去除噪声,提高数据的质量。

4、推荐系统:

在推荐系统中,用户-物品评分矩阵通常存在很多缺失值,对评分矩阵R进行SVD分解后,保留前k个较大的奇异值及其对应的U、V的部分列向量,构建低秩矩阵来近似R。这样就可以利用已知的评分来预测缺失的评分值,从而为用户推荐可能感兴趣的内容。

四、矩阵代码实例

import numpy as np# 创建一个矩阵 A (5x3)
A = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12],[13, 14, 15]])
print("原始矩阵 A:")
print(A)# 进行 SVD 分解
# full_matrices=False表示不计算完整的 U 和 V 矩阵,而是计算经济规模的分解,用于降维场景
U, sigma, Vt = np.linalg.svd(A, full_matrices=False)
print("\n奇异值 sigma:")
print(sigma)# 分别保留前 k 个奇异值进行降维
for k in [1, 2, 3]:U_k = U[:, :k] # 取 U 的前 k 列,因为要保持行数不变sigma_k = sigma[:k] # 取前 k 个奇异值Vt_k = Vt[:k, :] # 取 Vt 的前 k 行,因为要保持列数不变# 近似重构矩阵 A,p.diag() 将 sigma_k 转换为对角矩阵。@ 运算符表示矩阵乘法。A_approx = U_k @ np.diag(sigma_k) @ Vt_k# 近似误差等于差异程度的弗罗贝尼乌斯范数(fro 值)占原始矩阵fro值的比例。error = np.linalg.norm(A - A_approx, 'fro') / np.linalg.norm(A, 'fro')print(f"k={k} 时的近似误差: {error:.6f}")

k=1 时:原始3维列空间降为1维,使用U的第1列和Vt的第1行,结合第一个奇异值,重新拟合原矩阵,近似误差仅为4.19%。

k=2 时:原始3维列空间降为2维,使用U的前2列Vt的前2行,结合前两个奇异值,重新拟合原矩阵,此时已完全重构原始矩阵(误差为0)。

k=3 时:使用全部3个左/右奇异向量,但第三个奇异值为0,没有额外价值。

想象一个三维数据点云,SVD 分解会找到三个正交方向:

  • 第一个方向(对应最大奇异值):数据方差最大的方向,即数据点最 “伸展” 的方向。
  • 第二个方向(次大奇异值):与第一个方向正交且方差次大的方向。
  • 第三个方向(最小奇异值):与前两个方向正交且方差最小的方向。

当用 k=1 降维时,相当于将数据投影到第一个方向上,保留最主要的特征。如果选择第三个方向(最小奇异值),则会丢失所有重要信息。

五、机器学习代码实例

1、如何确保测试集和训练集降维到同 k 个特征空间?

训练集和测试集需经过相同变换来保证数据分布一致,这是确保模型评估和泛化有效性的关键。

 任何线性变换(如矩阵乘法)都可以分解为旋转 → 缩放 → 再旋转三个步骤。 

为什么使用右奇异向量而不是左奇异向量? 

2、代码实例

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
# 随机生成特征数据,并改变数据尺度,使范围大致在均值 0 附近,标准差变为 10
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}")

六、注意的问题 

1、标准化数据

不同特征可能具有不同的量纲(比如一个特征表示年龄,范围可能是 0 - 100,另一个特征表示收入,可能是 0 - 1000000),如果不进行标准化,具有较大数值范围的特征可能会在 SVD 计算中占据主导地位,从而影响降维结果。

标准化可以将所有特征转化到相同的尺度,使得每个特征对降维的贡献更加公平。可以使用 sklearn.preprocessing.StandardScaler。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

对测试集 X_test调用transform方法,使用在训练集上计算得到的均值和方差对测试集数据进行标准化。不能在测试集上使用fit_transform,否则会导致数据泄漏,会使模型评估结果过于乐观。 

2、选择合适的 k

可以通过累计方差贡献率(explained variance ratio)选择 k ,通常选择解释 90%-95% 方差的 k  值,它可以帮助我们确定保留多少个奇异值能够解释大部分的数据方差。

# 表示前k个奇异值所解释的方差(奇异值平方的累积和)占总方差的比例。
explained_variance_ratio = np.cumsum(sigma_train**2) / np.sum(sigma_train**2)
print(f"前 {k} 个奇异值的累计方差贡献率: {explained_variance_ratio[k-1]}")

3、使用 sklearn 的 TruncatedSVD

对于大规模数据,完整的 SVD 计算可能非常耗时且占用大量内存。TruncatedSVD类专门用于高效降维,它直接计算前k个奇异值和向量,避免了完整 SVD 的计算开销,提高了计算效率。

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=k, random_state=42)
X_train_reduced = svd.fit_transform(X_train)
X_test_reduced = svd.transform(X_test)
print(f"累计方差贡献率: {sum(svd.explained_variance_ratio_)}")

@浙大疏锦行 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

符合Python风格的对象(对象表示形式)

对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方 式。Python 提供了两种方式。 repr()   以便于开发者理解的方式返回对象的字符串表示形式。str()   以便于用户理解的方式返回对象的字符串表示形式。 正如你所知,我们要实现_…

springboot配置tomcat端口的方法

在Spring Boot中配置Tomcat端口可通过以下方法实现: 配置文件方式 properties格式 在application.properties中添加:server.port8081YAML格式 在application.yml中添加:server:port: 8082多环境配置 创建不同环境的配置文件(如app…

DeepSeek指令微调与强化学习对齐:从SFT到RLHF

后训练微调的重要性 预训练使大模型获得丰富的语言和知识表达能力,但其输出往往与用户意图和安全性需求不完全匹配。业内普遍采用三阶段训练流程:预训练 → 监督微调(SFT)→ 人类偏好对齐(RLHF)。预训练阶段模型在大规模语料上学习语言规律;监督微调利用人工标注的数据…

Maven 插件扩展点与自定义生命周期

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

ecmascript 第6版特性 ECMA-262 ES6

https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程

CT重建笔记(五)—2D平行束投影公式

写的又回去了,因为我发现我理解不够透彻,反正想到啥写啥,尽量保证内容质量好简洁易懂 2D平行束投影公式 p ( s , θ ) ∫ ∫ f ( x , y ) δ ( x c o s θ y s i n θ − s ) d x d y p(s,\theta)\int \int f(x,y)\delta(x cos\theta ysi…

记一次缓存填坑省市区级联获取的操作

先说缓存是什么? 缓存主要是解决高并发,大数据场景下,热点数据快速访问。缓存的原则首先保证数据的准确和最终数据一致,其次是距离用户越近越好,同步越及时越好。 再说我们遇到的场景: 接手项目后&#…

无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本

遇到“无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”这类错误,通常是因为你的 PowerShell 执行策略设置为不允许运行脚本。在 Windows 系统中,默认情况下,出于安全考虑,PowerShell 可能会阻止运行未…

OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好,Open WebUI 迎来重要更新,现已正式支持 MCP 工具服务器,但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理,经测试,它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具&#xff…

松下SMT贴片机选型与高效应用指南

内容概要 在电子制造领域,SMT贴片机作为核心生产设备,其选型与应用直接关系到企业产能与产品质量。本文聚焦松下SMT贴片机系列,通过系统性梳理设备选型逻辑与技术特性,为制造企业提供多维度的决策参考。重点涵盖主流机型性能参数…

计算机网络(1)——概述

1.计算机网络基本概念 1.1 什么是计算机网络 计算机网络的产生背景 在计算机网络出现之前,计算机之间都是相互独立的,每台计算机只能访问自身存储的数据,无法与其他计算机进行数据交换和资源共享。这种独立的计算机系统存在诸多局限性&#…

React学习(二)-变量

也是很无聊,竟然写这玩意,毕竟不是学术研究,普通工作没那么多概念性东西,会用就行╮(╯▽╰)╭ 在React中,变量是用于存储和管理数据的基本单位。根据其用途和生命周期,React中的变量可以分为以下几类&…

完整卸载 Fabric Manager 的方法

目录 ✅ 完整卸载 Fabric Manager 的方法 1️⃣ 停止并禁用服务 2️⃣ 卸载 Fabric Manager 软件包 3️⃣ 自动清理无用依赖(可选) 4️⃣ 检查是否卸载成功 ✅ 补充(仅清除服务,不删包) ✅ 完整卸载 Fabric Mana…

ABP vNext 多租户开发实战指南

🚀 ABP vNext 多租户开发实战指南 🛠️ 环境:.NET 8.0 ABP vNext 8.1.5 (C# 11, EF Core 8) 📚 目录 🚀 ABP vNext 多租户开发实战指南🏠 一、什么是多租户?📦 二、ABP 多租户的核…

【WIN】笔记本电脑忘记密码解决办法/笔记本电脑重装系统笔记/bitlocker忘记密码的解决办法

通过安全模式下的CMD命令找回 具体的步骤就是: 首先通过笔记本的对应的一个进入安全模式的一个方式 进入安全模式之后,一直点着这个诊断,然后高级选项进去就可以看到了。 但是这种方法应该是属于安全漏洞,所以只适合老版本。如果是…

人工智能100问☞第25问:什么是循环神经网络(RNN)?

目录 一、通俗解释 二、专业解析 三、权威参考 循环神经网络(RNN)是一种通过“记忆”序列中历史信息来处理时序数据的神经网络,可捕捉前后数据的关联性,擅长处理语言、语音等序列化任务。 一、通俗解释 想象你在和朋友聊天,每说一句话都会根据之前的对话内容调整语气…

实验八 基于Python的数字图像问题处理

一、实验目的  培养利用图像处理技术解决实际问题的能力。  培养利用图像处理技术综合设计实现的能力。  掌握在Python环境下解决实际问题的能力。  熟练掌握使用cv2库对图像进行处理  熟练掌握使用区域生长法提取图片中感兴趣的区域 二、实验内容 本次实验内容为…

STM32F10xx 参考手册

6. 什么是寄存器 本章参考资料:《STM32F10xx 参考手册》、《STM32F10xx数据手册》、 学习本章时,配合《STM32F10xx 参考手册》“存储器和总线架构”及“通用I/O(GPIO)”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。…

TCVectorDB 向量数据库简介

简介 尽管目前大多数开源向量数据库来自海外,配置简单且性能优异,但由于网络原因,如果向量数据库部署在海外,而产品面向国内市场,网络延迟将是必须考虑的问题。因此,选择国内服务提供商的云向量数据库往往是…

力扣-比特位计数(统计一个数二进制下1的个数)

下面是题面 1.用c的内置函数__builtin_popcount() 语法:__builtin_popcount(int x),函数会返回一个二进制下x所含的1的个数 2.直接数位枚举 这是最慢也是暴力做法,写法也很简单 用一个while循环…