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

DAY20 奇异值SVD分解

@浙大疏锦行
知识点:

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

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


1 奇异值

奇异值分解(SVD)的输入和输出:

  • 输入:一个任意的矩阵 AAA,尺寸为 m×nm \times nm×n(其中 mmm 是行数,nnn 是列数,可以是矩形矩阵,不必是方阵)。
  • UUU(左奇异向量矩阵)m×mm \times mm×m 的正交矩阵
  • Σ\SigmaΣ(奇异值矩阵)m×nm \times nm×n 的对角矩阵,对角线上的值是奇异值
  • VTV^TVT(右奇异向量矩阵的转置)VVV 的转置,VVV 是一个 n×nn \times nn×n 的正交矩阵

结合起来,A=UΣVTA = U \Sigma V^TA=UΣVT 意味着原始矩阵 AAA 可以被分解为一系列主方向(UUUVVV)和对应的权重(Σ\SigmaΣ)的组合。
主要作用于降维、数据压缩、去噪、推荐系统。

2 作业

前提是已经完成特征编码,划分好训练集和测试集。

# 标准化数据(需要标准化)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 对训练集进行 SVD 分解
U_train, sigma_train, Vt_train = np.linalg.svd(X_train, full_matrices=False)
# 计算每个奇异值的方差贡献率及累计方差贡献率
singular_values_squared = sigma_train ** 2
total_variance = np.sum(singular_values_squared)
explained_variance_ratio = np.cumsum(singular_values_squared) / total_variance# 根据目标贡献率自动选择k(例如选择累计贡献率达到95%的最小k)
target_ratio = 0.95  # 可以根据需要调整,如0.90, 0.99等
k = np.argmax(explained_variance_ratio >= target_ratio) + 1  # +1因为索引从0开始print(f"满足累计方差贡献率{target_ratio*100}%的最小k值为: {k}")
print(f"前{k}个奇异值的实际累计方差贡献率: {explained_variance_ratio[k-1]:.4f}")

得出最小k值为15:
k值

Vt_k = Vt_train[:k, :]  # 保留前 k 行# 降维训练集:X_train_reduced = X_train @ Vt_k.T
X_train_reduced = X_train @ Vt_k.T# 使用相同的 Vt_k 对测试集进行降维:X_test_reduced = X_test @ Vt_k.T
X_test_reduced = X_test @ Vt_k.Tfrom sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 训练模型(以逻辑回归为例)
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.lryc.cn/news/596132.html

相关文章:

  • 【bug】Yolo11在使用tensorrt推理numpy报错
  • 【数据可视化-70】奶茶店销量数据可视化:打造炫酷黑金风格的可视化大屏
  • 使用qt编写上位机程序,出现串口死掉无法接受数据的bug
  • vue2 webpack 部署二级目录、根目录nginx配置及打包配置调整
  • 【深度解析】从AWS re_Invent 2025看云原生技术发展趋势
  • kafka主题管理详解 - kafka-topics.sh
  • C++ 结构体(struct)与联合体(union)
  • 逻辑回归全景解析:从数学本质到工业级优化
  • AWS PrivateLink方式访问Redis
  • NIO技术原理以及应用(AI)
  • AWS RDS 排查性能问题
  • 图像基础:从像素到 OpenCV 的入门指南
  • 基于python django深度学习的中文文本检测+识别,可以前端上传图片和后台管理图片
  • 【学习路线】Python全栈开发攻略:从编程入门到AI应用实战
  • Spring 核心知识点梳理 1
  • 2.9学习DOM和BOM (主要是获取元素的操作)
  • 【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决
  • 重塑优化建模与算法设计:2025年大模型(LLM)在优化领域的应用盘点 - 1
  • MybatisPlus-16.扩展功能-枚举处理器
  • SpringMVC快速入门之核心配置详解
  • 【windows修复】解决windows10,没有【相机] 功能问题
  • Azure可靠性架构指南:构建云时代的高可用系统
  • xss-labs解答
  • 本地数据库有数据,web页面无信息显示,可能是pymysql的版本问题【pymysql连接本地数据库新旧版本的区别】
  • 【51单片机定时器T0输出10毫秒周期方波12M晶振】2022-6-28
  • Web开发 05
  • verilator如何实现RTL的仿真(腾讯混元)
  • 牛客NC16625 [NOIP2009]分数线划定(排序)
  • vue3:十八、内容管理-实现内容的数据展示,开关switch设行,tag标签展示
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十七天