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

day 32 打卡

今天打卡的内容介绍下特征降维中非特征筛选的方法。
首先需要介绍一个经典的工具svd 奇异值分解,她是很多降维算法的基础。总结:
1、计算特征值和特征向量:通过特征方程求解。
2、矩阵对角化:判断矩阵是否对角化,并求对角化矩阵。
3、利用特征值分解求矩阵幂或函数:通过分解简化高次幂计算
4、证明题:如证明某些矩阵性质与特征值的关系。在SVD中的作用
在sVD 中,特征值和特征向量的概念用于计算奇异值和奇异向量。svd的奇异值是通过A的转置*A,的特征值取平方根得倒,特征向量则与奇异向量相关。
总结与联系
正交矩阵:列向量正交且单位化,在sVD中用于旋转或反射(U和v)
特征值与特征向量:描述矩阵在某些方向上的缩放特性,是计算奇异值的基础。
对称矩阵:具有实特征值和正交特征向量,svd通过构造A的转置*A,利用其性质。
矩阵分解:将复杂矩阵分解为简单矩阵乘积,是降维和数据分析的核心工具。奇异值分解的输入和输出:
输入:一个任意的矩阵A,尺寸为m* n(其中m 是行数,n 是列数,可以是矩形矩阵,不必是方阵)
奇异值分解svd  得到的三个矩阵U,
奇异值分解(SVD)得到的三个矩阵 $U$、$\Sigma$ 和 $V^T$ 各有其特定的意义和用途,下面我简要说明它们的作用:
1、 $U$(左奇异向量矩阵):
是一个m * m 的正交矩阵,列向量是矩阵AA的转置的特征向量
作用:表示原始矩阵A在行空间中的主方向或基向量。
简单来说,$U$、$\Sigma$ 和 $V^T$ 提供了数据的核心结构信息,帮助我们在保留主要信息的同时简化数据处理。- **输出**:SVD 将矩阵 $A$ 分解为三个矩阵的乘积形式,即 $A = U \Sigma V^T$,其中:- $U$:一个 $m \times m$ 的正交矩阵,列向量是 $A A^T$ 的特征向量,称为左奇异向量矩阵。- $\Sigma$:一个 $m \times n$ 的对角矩阵,对角线上的元素是非负的奇异值(singular values),通常按降序排列,表示 $A$ 的“重要性”或“能量”。- $V^T$:一个 $n \times n$ 的正交矩阵的转置,$V$ 的列向量是 $A^T A$ 的特征向量,称为右奇异向量矩阵。
实际案例:
输出解释:**输出解释**:
- 原始矩阵 $A$ 被分解为 $U$、$\Sigma$(由 `sigma` 表示)和 $V^T$。
- 通过 $U \cdot \Sigma \cdot V^T$ 的矩阵乘法,可以完全重构原始矩阵 $A$,几乎没有信息损失(可能有非常小的数值误差)。矩阵降维案例import numpy  as  np
# 创建一个矩阵A(5*3)
A=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]])
print ("原始矩阵 A")
print(A)
# 进行svd分解
U,sigma,VT=np.linalg.svd(A,full_matrices=False) 
print("\n 奇异值 sigma:")
print (sigma)
# 保留前 k=1 个奇异值进行降维
k=1
U_k=U[:,:k]# 取U的前k列,因为要保持行数不变
sigma_k=sigma[:k]# 取前k 个奇异值
Vt_k=VT[:k,:]# 取vt的前k行,因为要保持列数不变# 近似重构矩阵A,常用语信号or 图像筛除噪声
A_approx=U_k @np.diag(sigma_k)@Vt_k
print("\n 降维后的矩阵 A_approx:")
print(A_approx)#计算近似误差
error=np.linalg.norm(A-A_approx,'fro')/np.linalg.norm(A,'fro')
print("\n 近似误差:")
print(error)
可以看到,再保留了k=1个奇异值后,近似误差仅为4.19%,这个表明了降维方式的非常有效。丢失的信息很少。在机器学习中,如果针对训练集进行svd降维后训练模型,而测试集的特征数量与降维后的训练集不一致,如何处理?1、问题分析
训练集降维:假设训练集有1000个样本,50个特征,通过svd 降维后保留k=10个特征,得到形状为(1000,10)的新数据,模型基于10 个特征进行训练。
测试集问题:测试集假设有200个样本,仍然是50个特征。如果直接输入测试集到模型中,特征数据不匹配,会导致模型训练错误。模型期望是10个特征,测试集是50个。
核心问题:如何确保测试集也能被正确的降维到与训练集相同的k 个特征空间?2、解决方案:对测试集应用相同的变换
在机器学习中,降维如SVD,pca是一种数据预处理步骤。训练集和测试集必须经过相同的变换,确保数据分布一致,具体到svd ,步骤如下:
1、训练阶段:对训练集x——train 进行svd 分解。得到得到 $U$, $\Sigma$, 和 $V^T$,并保存 $V^T$ 矩阵(或其前 $k$ 行)用于降维变换。
2、测试阶段:使用从训练集得到的 $V^T$ 矩阵,将测试集 $X_{test}$ 投影到相同的低维空间,得到降维后的测试数据。
3、原因:$V^T$ 矩阵定义了从原始特征空间到低维特征空间的映射关系,测试集必须使用相同的映射以保持一致性。
3、为什么不能对测试集单独做svd?
如果对测试集单独进行svd,会得到不同的$V^T$矩阵,导致测试集和训练集的低维空间不一致,模型无法正确处理测试数据。
训练集:$V^T$矩阵代表了训练数据的特征映射规则,测试集必须遵守相同的规则,否则会引入数据泄漏或不一致性问题。4、代码演示:训练集和测试集的svd 降维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,:]
print(f"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_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:.4f}")# 计算训练集的近似误差
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"训练集近似误差:{error:.4f}")

@浙大疏锦行

http://www.dtcms.com/a/293407.html

相关文章:

  • Linux中信号认识及处理和硬件中断与软中断的讲解
  • 生成式人工智能对网络安全的影响
  • 软件工程:软件设计
  • Python机器学习:从零基础到项目实战
  • 一个基于现代C++智能指针的优雅内存管理解决方案
  • Pycharm下载、安装及配置
  • Linux 内核不能直接访问物理地址,必须通过虚拟地址访问。
  • 17.VRRP技术
  • 【C++】简单学——vector类(模拟实现)
  • 基于SpringBoot+Vue的班级管理系统(Echarts图形化分析)
  • 一、Vue概述以及快速入门
  • DeepSeek下载量断崖式下跌72%,AI助手市场大洗牌 | AI早报
  • 广播分发中心-广播注册流程
  • 秋招Day17 - Spring - AOP
  • 构建RAG智能体(2):运行状态链
  • C#文件操作(创建、读取、修改)
  • 【世纪龙科技】电动汽车原理与构造-汽车专业数字课程资源
  • [c++11]final和override
  • 黄山派lvgl8学习笔记(2)导入头文件和新建一个按钮控件
  • 标记语言---XML
  • linux 驱动-power_supply 与 mtk 充电框架
  • 工业互联网时代,如何通过混合SD-WAN提升煤炭行业智能化网络安全
  • 【Pytorch】数据集的加载和处理(一)
  • 使用ubuntu:20.04和ubuntu:jammy构建secretflow环境
  • ndarray的创建(小白五分钟从入门到精通)
  • 嵌入式开发学习(第三阶段 Linux系统开发)
  • 数据资产——解读数据资产全过程管理手册2025【附全文阅读】
  • [c++11]constexpr
  • 考研数据结构Part1——单链表知识点总结
  • 陷波滤波器设计全解析:原理、传递函数与MATLAB实现