You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Numpy寻找特定特征值对应的特征向量及截断SVD实现

实现截断SVD并获取对应奇异向量的解决方案

嘿,我来帮你搞定截断SVD的实现!在Numpy里做这个其实很直接,咱们一步步来:

1. 先执行完整的SVD分解

首先,你需要对目标矩阵执行完整的奇异值分解。Numpy的np.linalg.svd函数会直接返回按降序排列的奇异值,以及对应的左、右奇异向量矩阵:

import numpy as np

# 假设你的输入矩阵是A
U, S, Vt = np.linalg.svd(A, full_matrices=False)
  • 参数full_matrices=False很关键:它会返回"瘦型"的U和Vt,避免生成不必要的大矩阵,更适合后续截断操作。
  • 这里的S已经是降序排列的奇异值数组,所以你之前的desired_singular_values = S[:desired_num_singular]其实就可以直接用,不需要额外排序(除非你自己做了特殊处理)。

2. 截断得到目标部分

接下来,只需要提取前desired_num_singular个奇异值对应的向量和矩阵即可:

desired_num_singular = 5  # 替换成你需要保留的奇异值数量

# 截断左奇异向量矩阵U:取前desired_num_singular列
U_truncated = U[:, :desired_num_singular]
# 截断奇异值数组:取前desired_num_singular个值
S_truncated = S[:desired_num_singular]
# 把截断后的奇异值转成对角矩阵(方便后续重构原矩阵)
S_truncated_diag = np.diag(S_truncated)
# 截断右奇异向量的转置矩阵Vt:取前desired_num_singular行
Vt_truncated = Vt[:desired_num_singular, :]
# 如果需要右奇异向量的列形式,转置一下就行
V_truncated = Vt_truncated.T

3. 验证截断效果(可选)

你可以用截断后的矩阵重构原矩阵的近似版本,来验证结果是否正确:

A_truncated = U_truncated @ S_truncated_diag @ Vt_truncated
# 计算重构误差,数值越小说明截断效果越好(保留的奇异值越多误差越小)
reconstruction_error = np.linalg.norm(A - A_truncated)
print(f"重构误差: {reconstruction_error:.4f}")

关键说明

  • U_truncated的每一列,对应你选中的前k个最大奇异值的左奇异向量
  • V_truncated的每一列,对应这些奇异值的右奇异向量
  • 如果你之前自己对奇异值做了排序,一定要确保排序后的奇异值和U、Vt中的向量顺序对应,否则会导致向量和奇异值不匹配(不过Numpy默认返回的S已经是降序,所以一般不需要额外排序)

内容的提问来源于stack exchange,提问作者SamTulster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:19:28