Day20打卡-奇异值SVD分解

今天学习非特征筛选的方法:

知识点回顾:

  1. 线性代数概念回顾(可不掌握)
  2. 奇异值推导(可不掌握)
  3. 奇异值的应用
    1. 特征降维:对高维数据减小计算量、可视化
    2. 数据重构:比如重构信号、重构图像(可以实现有损压缩,k 越小压缩率越高,但图像质量损失越大)
    3. 降噪:通常噪声对应较小的奇异值。通过丢弃这些小奇异值并重构矩阵,可以达到一定程度的降噪效果。
    4. 推荐系统:在协同过滤算法中,用户-物品评分矩阵通常是稀疏且高维的。SVD (或其变种如 FunkSVD, SVD++) 可以用来分解这个矩阵,发现潜在因子 (latent factors),从而预测未评分的项。这里其实属于特征降维的部分。
  • 奇异矩阵SVD分解

对于任何矩阵(如结构化数据可以变为:样本*特征的矩阵,图像数据天然就是矩阵),均可做等价的奇异值SVD分解,对于分解后的矩阵,可以选取保留前K个奇异值及其对应的奇异向量,重构原始矩阵,可以通过计算Frobenius 范数相对误差来衡量原始矩阵和重构矩阵的差异。

应用:结构化数据中,将原来的m个特征降维成k个新的特征,新特征是原始特征的线性组合,捕捉了数据的主要方差信息,降维后的数据可以直接用于机器学习模型(如分类、回归),通常能提高计算效率并减少过拟合风险。

ps:在进行 SVD 之前,通常需要对数据进行标准化(均值为 0,方差为 1),以避免某些特征的量纲差异对降维结果的影响。

作业:尝试利用svd来处理心脏病预测,看下精度变化

(一)SVD介绍

#SVD 的奇异值是通过对 A^T A 或 A A^T的特征值取平方根得到的,特征向量则与奇异向量相关

#在 SVD 中,我们构造 A^T A 和 A A^T,这两个矩阵都是对称矩阵,因此可以进行特征值分解,进而求解奇异值和奇异向量

#SVD 是一种更广义的矩阵分解方法,适用于非方阵,而特征值分解是 SVD 计算的基础步骤。

  • 总结:

- 正交矩阵:列向量正交且单位化,在 SVD 中用于旋转或反射(U 和 V)。

- 特征值与特征向量:描述矩阵在某些方向上的缩放特性,是计算奇异值的基础。

- 对称矩阵:具有实特征值和正交特征向量,SVD 通过构造 A^T A 和 A A^T 利用其性质。

- 矩阵分解:将复杂矩阵分解为简单矩阵乘积,是降维和数据分析的核心工具。

SVD通过将矩阵分解为奇异值和正交基,揭示了数据的本质结构。其输入为任意矩阵,输出为三个具有明确意义的子矩阵,广泛应用于降维、推荐、NLP等领域

(二)SVD的输入和输出

  • 输入:一个任意的矩阵 AA,尺寸为 m×n(其中 m 是行数,n是列数,可以是矩形矩阵,不必是方阵)。

奇异值分解(SVD)得到的三个矩阵 U、Σ 和 VT 各有其特定的意义和用途:

  1. U(左奇异向量矩阵)

    • 是一个 m×m 的正交矩阵,列向量是矩阵 AAT 的特征向量。
    • 作用:表示原始矩阵 A在行空间(样本空间)中的主方向或基向量。简单来说,U 的列向量描述了数据在行维度上的“模式”或“结构”。
    • 应用:在降维中,U的前几列可以用来投影数据到低维空间,保留主要信息(如在图像处理中提取主要特征)。
  2. Σ(奇异值矩阵)

    • 是一个 m×n的对角矩阵,对角线上的值是奇异值(singular values),按降序排列,非负。
    • 作用:奇异值表示原始矩阵 A 在每个主方向上的“重要性”或“能量”。较大的奇异值对应更重要的特征,较小的奇异值对应噪声或次要信息。
    • 应用:通过选择前 k 个较大的奇异值,可以实现降维,丢弃不重要的信息(如数据压缩、去噪)。
  3. VT(右奇异向量矩阵的转置)

    • 是 V 的转置,V 是一个 n×n的正交矩阵,列向量是矩阵 ATA 的特征向量。
    • 作用:表示原始矩阵 A在列空间(特征空间)中的主方向或基向量。简单来说,V 的列向量描述了数据在列维度上的“模式”或“结构”。
    • 应用:类似 U,V的前几列可以用来投影数据到低维空间,提取主要特征。

整体作用

结合起来,A=UΣVT 意味着原始矩阵 A可以被分解为一系列主方向(U和 V)和对应的权重(Σ)的组合。这种分解揭示了数据的内在结构。

主要应用

  1. 降维:通过保留前 k 个奇异值及其对应的 U 和 V 的列向量,可以近似重建A,减少数据维度(如 PCA 的基础)。
  2. 数据压缩:如图像压缩,丢弃小的奇异值以减少存储空间。
  3. 去噪:小的奇异值往往对应噪声,丢弃它们可以提高数据质量。
  4. 推荐系统:如矩阵分解,用于预测用户评分矩阵中的缺失值。

简单来说,U、Σ 和 VT 提供了数据的核心结构信息,帮助我们在保留主要信息的同时简化数据处理

  • 输出

SVD 将矩阵 A 分解为三个矩阵的乘积形式,即 A=UΣVT

 (三)奇异值应用——降维/数据压缩

奇异值排序——筛选——降维和近似——对应向量

筛选靠前的k个对角线上值(奇异值),取U阵前k列和Σ前k奇异值和VT前k行可实现降维

总结:SVD 分解后原始矩阵是等价的,但通过筛选排序靠前的奇异值和对应的向量,我们可以实现降维,保留数据的主要信息,同时减少计算量和噪声影响。这种方法是许多降维算法(如 PCA)和数据处理技术的基础。

  • 问题:在机器学习中,如果对训练集进行 SVD 降维后训练模型,而测试集的特征数量与降维后的训练集不一致(测试集仍保持原始特征数量),该如何处理?

答:同样地对测试集进行等效降维(进行相同变换) ,若对测试集单独进行 SVD,会得到不同的 V^T 矩阵,导致测试集和训练集的低维空间不一致,模型无法正确处理测试数据

(四)作业


import warnings
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
warnings.filterwarnings("ignore")# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
data = pd.read_csv('heart.csv')
# 最开始也说了 很多调参函数自带交叉验证,甚至是必选的参数,你如果想要不交叉反而实现起来会麻烦很多
# 所以这里我们还是只划分一次数据集
from sklearn.model_selection import train_test_split
X = data.drop(['target'], axis=1)  # 特征,axis=1表示按列删除
y = data['target'] # 标签
# # 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%训练集,20%测试集
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
np.random.seed(42)
print(f"训练集形状: {X_train.shape}")
print(f"测试集形状: {X_test.shape}")
U_train, sigma_train, Vt_train = np.linalg.svd(X_train, full_matrices=False) ##full_matrices=False 表示只计算 U 和 Vt 的前 k 列,其中 k 是矩阵 A 的秩。进行经济SVD分解
print(f"Vt_train 矩阵形状: {Vt_train.shape}")
# 选择保留的奇异值数量 k
k = 8
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}")
# 计算训练集的近似误差(可选,仅用于评估降维效果)
#近似重构矩阵 A,常用于信号or图像筛除噪声
X_train_approx = U_train[:, :k] @ np.diag(sigma_train[:k]) @ Vt_k # 取 U 的前 k 列,因为要保持行数不变;# 取前 k 个奇异值#取Vt_k所有行#np.diag(sigma_k) :将降维后的奇异值数组 sigma_k 转换为对角矩阵,对角线上的元素为 sigma_k 中的值,其他位置为 0。
error = np.linalg.norm(X_train - X_train_approx, 'fro') / np.linalg.norm(X_train, 'fro')
print(f"训练集近似误差 (Frobenius 范数相对误差): {error}")

结果如下:

训练集形状: (242, 13)
测试集形状: (61, 13)
Vt_train 矩阵形状: (13, 13)
保留 k=8 后的 Vt_k 矩阵形状: (8, 13)
降维后训练集形状: (242, 8)
降维后测试集形状: (61, 8)
测试集准确率: 0.8688524590163934
训练集近似误差 (Frobenius 范数相对误差): 0.002934026637631935
  • 评价报告
from sklearn.ensemble import RandomForestClassifier #随机森林分类器from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵rf_model_var = RandomForestClassifier(random_state=42)  #实例化
rf_model_var.fit(X_train_reduced, y_train)                  # 训练
rf_pred_var = rf_model_var.predict(X_test_reduced)         #预测# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\nSVD降维后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_var))# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("SVD降维后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_var))

结果:

SVD降维后随机森林在测试集上的分类报告:precision    recall  f1-score   support0       0.81      0.90      0.85        291       0.90      0.81      0.85        32accuracy                           0.85        61macro avg       0.85      0.85      0.85        61
weighted avg       0.86      0.85      0.85        61SVD降维后随机森林在测试集上的混淆矩阵:
[[26  3][ 6 26]]

@浙大疏锦行

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

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

相关文章

temu采购自养号全流程解析:从账号搭建到安全下单的技术闭环

temu 自养号采购下单技术是一个精细的过程,需要从多个方面进行考虑和操作,其核心在于通过技术手段模拟真实用户行为,构建独立、安全的账号环境以确保账号的安全性、真实性和采购下单的成功率。以下是对该技术的详细解析 1. 账号准备 手机号…

相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…

自定义类型-结构体(二)

结构体内存对齐 偏移量 指的是结构体中某个成员相对于结构体起始地址的字节距离 第一个成员的起始位置为0,一个字节表示一个单位 这里的数字表示的是该成员地址与结构体首地址之间的值 对齐规则 1.结构体第一个成员的第一个字节的偏移量为0 2.其余成员变量要…

【免费工具】图吧工具箱2025.02正式版

DIY爱好者的必备工具 软件截图: —————【下 载 地 址】——————— 【本章单下载】:https://drive.uc.cn/s/f08aad37ddb14 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1k0ODFcWMt2n0d?fromfrom_copylink …

DAX 权威指南1:DAX计算、表函数与计算上下文

参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…

【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析

文章目录 前言一、打印命令行提示符代码功能概述 二、读取键盘输入的指令2.1 为什么不继续使用scanf()而换成了fgets()?2.2 调试输出的意义2.3 为什么需要去掉换行符? 三、指令切割补充知识: strtok 的函数原型 四、普通命令的执行代码功能概…

湖仓一体架构在金融典型数据分析场景中的实践

在数字经济与金融科技深度融合的今天,数据已成为金融机构的核心战略资产。然而,传统数据架构面临着三大困局,制约着金融机构数据价值的充分释放。 一、需求驱动更多银行数据分析场景 金融机构,特别是银行业,面临着双重…

基于Llama3的开发应用(一):Llama模型的简单部署

Llama模型的简单部署 0 前言1 环境准备1.1 硬件环境1.2 软件环境 2 Meta-Llama-3-8B-Instruct 模型简介2.1 Instruct含义2.2 模型下载 3 简单调用4 FastAPI 部署4.1 通过FastAPI简单部署4.2 测试 5 使用 streamlit 构建简易聊天界面6 总结 0 前言 本系列文章是基于Meta-Llama-…

模拟太阳系(C#编写的maui跨平台项目源码)

源码下载地址:https://download.csdn.net/download/wgxds/90789056 本资源为用C#编写的maui跨平台项目源码,使用Visual Studio 2022开发环境,基于.net8.0框架,生成的程序为“模拟太阳系运行”。经测试,生成的程序可运行…

基于人工智能的个性化 MySQL 学习路径推荐研究

基于人工智能的个性化 MySQL 学习路径推荐研究 摘要: 随着信息技术的飞速发展,数据库在各行业应用广泛,MySQL 作为主流数据库之一,学习需求庞大。然而,不同学习者在知识水平、学习进度和目标上存在差异,传统统一的学习路径难以满足个性化需求。本研究通过运用人工智能技…

OSPF综合应用

​ 要求: 1,R5为ISP,其上只能配置IP地址;R4作为企业边界路由器, 出口公网地址需要通过PPP协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分; 3,所有设备…

中国古代史1

朝代歌 三皇五帝始,尧舜禹相传。 夏商与西周,东周分两段。 春秋和战国,一统秦两汉。 三分魏蜀吴,二晋前后延。 南北朝并立,隋唐五代传。 宋元明清后,皇朝至此完。 原始社会 元谋人,170万年前…

ensp的华为小实验

1.先进行子网划分 2.进行接口的IP地址配置和ospf的简易配置,先做到全网小通 3.进行ospf优化 对区域所有区域域间路由器进行一个汇总 对区域1进行优化 对区域2.3进行nssa设置 4.对ISP的路由进行协议配置 最后ping通5.5.5.5

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录…

IOC和Bean

IOC IOC将对象的创建,依赖关系的管理和生命周期的控制从应用程序代码中解耦出来了 IOC容器的依赖注入(DI) 在程序运行过程中动态的向某个对象中注入他所需要的其他对象 依赖注入是基于反射实现的 Spring IOC 容器使用的是Map(concorrentMap&#xff…

vue3: pdf.js 2.16.105 using typescript

npm create vite vuepdfpreview //创建项目npm install vue-pdf-embed npm install vue3-pdfjs npm install pdfjs-dist2.16.105 <!--* |~~~~~~~|* | |* | |…

Java面试全栈解析:Spring Boot、Kafka与Redis实战揭秘

《Java面试全栈解析&#xff1a;Spring Boot、Kafka与Redis实战揭秘》 【面试现场】 面试官&#xff1a;&#xff08;推了推眼镜&#xff09;小张&#xff0c;你简历里提到用Spring Boot开发过微服务系统&#xff0c;能说说自动配置的实现原理吗&#xff1f; 程序员&#xff1…

常见的提示词攻击方法 和防御手段——提示词注入(Prompt Injection)攻击解析

提示词注入&#xff08;Prompt Injection&#xff09;攻击解析 提示词注入是一种针对大型语言模型&#xff08;LLM&#xff09;的新型攻击手段&#xff0c;攻击者通过精心设计的输入文本&#xff08;提示词&#xff09;操控AI模型的输出&#xff0c;使其执行非预期行为或泄露敏…

基于NI-PXI的HIL系统开发

基于NI-PXI平台的汽车电控单元HIL系统开发全解析 引言&#xff1a;HIL系统如何成为汽车电控开发的“效率倍增器”&#xff1f; 某车企通过基于NI-PXI的HIL系统&#xff0c;将悬架控制器的测试周期从3个月压缩至2周&#xff0c;故障检出率提升65%。这背后是硬件在环技术对汽车电…

复合机器人案例启示:富唯智能如何以模块化创新引领工业自动化新标杆

在国产工业机器人加速突围的浪潮中&#xff0c;富唯智能复合机器人案例凭借其高精度焊接与智能控制技术&#xff0c;成为行业标杆。然而&#xff0c;随着制造业对柔性化、全场景协作需求的升级&#xff0c;复合机器人正从单一功能向多模态协同进化。作为这一领域的创新者&#…