DAY20 超大力王爱学Python

奇异值分解这个理论,对于你未来无论是做图像处理、信号处理、特征提取、推荐系统等都非常重要,所以需要单独抽出来说一下这个思想。---甚至我在非常多文章中都看到单独用它来做特征提取(伪造的很高大上),学会这个思想并不复杂

没学过线代的不必在意,推导可以不掌握,关注输入输出即可。今天这期有点类似于帮助大家形成闭环---考研数学不是白考的

知识点回顾:

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

知识点回顾:

对于任何矩阵(如结构化数据可以变为:样本*特征的矩阵,图像数据天然就是矩阵),均可做等价的奇异值SVD分解,对于分解后的矩阵,可以选取保留前K个奇异值及其对应的奇异向量,重构原始矩阵,可以通过计算Frobenius 范数相对误差来衡量原始矩阵和重构矩阵的差异。

应用:结构化数据中,将原来的m个特征降维成k个新的特征,新特征是原始特征的线性组合,捕捉了数据的主要方差信息,降维后的数据可以直接用于机器学习模型(如分类、回归),通常能提高计算效率并减少过拟合风险。

ps:在进行 SVD 之前,通常需要对数据进行标准化(均值为 0,方差为 1),以避免某些特征的量纲差异对降维结果的影响。

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

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from scipy.linalg import svd
from sklearn.preprocessing import StandardScaler
import numpy as np

# 加载数据集
df = pd.read_csv('/mnt/heart.csv')

# 划分特征和目标变量
X = df.drop('target', axis=1)
y = df['target']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 构建逻辑回归模型
logreg = LogisticRegression(max_iter=1000)
logreg.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = logreg.predict(X_test)

# 评估模型精度
accuracy_base = accuracy_score(y_test, y_pred)

# 对训练集特征矩阵进行SVD分解
U, s, Vt = svd(X_train, full_matrices=False)

# 选择部分奇异值(例如前8个)
k = 8
U_k = U[:, :k]
s_k = np.diag(s[:k])
Vt_k = Vt[:k, :]

# 重构数据
X_train_reconstructed = np.dot(U_k, np.dot(s_k, Vt_k))

# 在重构的数据上构建逻辑回归模型
logreg_svd = LogisticRegression(max_iter=1000)
logreg_svd.fit(X_train_reconstructed, y_train)

# 对测试集特征矩阵进行SVD分解并重构
U_test, s_test, Vt_test = svd(X_test, full_matrices=False)
U_test_k = U_test[:, :k]
s_test_k = np.diag(s_test[:k])
Vt_test_k = Vt_test[:k, :]
X_test_reconstructed = np.dot(U_test_k, np.dot(s_test_k, Vt_test_k))

# 在重构的测试集上进行预测
y_pred_svd = logreg_svd.predict(X_test_reconstructed)

# 评估模型精度
accuracy_svd = accuracy_score(y_test, y_pred_svd)

# 输出结果
print(f"基准模型精度: {accuracy_base}")
print(f"SVD处理后模型精度: {accuracy_svd}")
基准模型精度: 0.8524590163934426
SVD处理后模型精度: 0.8688524590163934

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值