使用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矩阵。 - 原代码其他问题修正:
- 若必须构建完整Sigma矩阵,正确填充方式应为针对n×n的子矩阵(因为s长度等于特征数n):
Sigma = zeros((X.shape[0], X.shape[1])) Sigma[:X.shape[1], :X.shape[1]] = diag(s) # 取前7行7列填充对角矩阵 - 原代码中
X_transformed = X_new.dot(VT.T)属于冗余错误操作,降维特征无需通过重建数据二次变换。
- 若必须构建完整Sigma矩阵,正确填充方式应为针对n×n的子矩阵(因为s长度等于特征数n):
内容的提问来源于stack exchange,提问作者Mukhammadyusuf Yuldashev Kobul
相关产品推荐
相关产品推荐

