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

使用SVD进行数据集降维时遇形状不匹配错误,求代码排查与方案

SVD降维尺寸匹配错误排查与修正

错误原因分析

你的数据集是199行7列(m=199,n=7),执行SVD后得到的奇异值数组s长度为min(m,n)=7,因此diag(s)是7×7的矩阵。但代码中尝试将这个7×7矩阵赋值给Sigma[:199, :199](199×199的切片),维度不匹配,直接触发了ValueError。

修正后的SVD降维代码

from numpy import diag
from numpy import zeros
from scipy.linalg import svd
from sklearn.preprocessing import StandardScaler

# 假设X是已标准化的199×7数组
# X = StandardScaler().fit_transform(your_dataset)

# 执行SVD分解,full_matrices=False适合降维场景,避免生成冗余大矩阵
U, s, VT = svd(X, full_matrices=False)

# 设定降维后的目标维度
n_components = 2

# 核心降维操作:取U的前n_components列,乘以对应奇异值得到降维特征
X_transformed = U[:, :n_components] * s[:n_components]

# (可选)从降维结果重建原始数据,用于验证降维效果
X_reconstructed = X_transformed.dot(VT[:n_components, :])

print("降维后的数据形状:", X_transformed.shape)  # 输出应为(199, 2)
print("重建后的数据形状:", X_reconstructed.shape)  # 输出应为(199,7)

关键逻辑说明

  • full_matrices=False:当样本数大于特征数(m>n)时,该参数让U输出为m×n矩阵、VT输出为n×n矩阵,避免生成不必要的超大矩阵,提升运算效率。
  • 降维本质:SVD降维是保留前k个最大奇异值对应的特征,直接通过U[:, :k] * s[:k]即可得到降维结果,无需手动构建完整的Sigma矩阵。
  • 原代码其他问题修正:
    1. 若必须构建完整Sigma矩阵,正确填充方式应为针对n×n的子矩阵(因为s长度等于特征数n):
      Sigma = zeros((X.shape[0], X.shape[1]))
      Sigma[:X.shape[1], :X.shape[1]] = diag(s)  # 取前7行7列填充对角矩阵
      
    2. 原代码中X_transformed = X_new.dot(VT.T)属于冗余错误操作,降维特征无需通过重建数据二次变换。

内容的提问来源于stack exchange,提问作者Mukhammadyusuf Yuldashev Kobul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:01:08