Python day20 - 特征降维之奇异值分解
python day20.
内容:
- 奇异值分解
- 对于任何的矩阵都可以做等价的奇异值SVD分解,并进行奇异值和特征向量的选取,进而实现重构。同时,使用Frobenius 范数相对误差来衡量原始矩阵和重构矩阵的差异。
- 在机器学习中,就是将m个特征降维成k个新特征(k的选择需要注意),新特征是原始特征的线性组合。
- svd之前数据需要进行标准化(均值为0,方差为1)
- 总而言之,针对结构化数据,奇异值分解就是一种特征降维的处理手段,能提高计算效率并减少过拟合风险,而sklearn库中也提供了相应的模块TruncatedSVD
代码:
c
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, :] # 保留前 k 行,形状为 (k, 50)
print(f"保留 k={k} 后的 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 @ Vt_k.T
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}")# 计算训练集的近似误差(可选,仅用于评估降维效果)
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')
c