当前位置: 首页 > wzjs >正文

推广网站的作用百度导航和百度地图

推广网站的作用,百度导航和百度地图,做网站需要多少钱西安,石家庄网站建设团队今天学习讲义Day20的内容 奇异值SVD分解 浙大疏锦行 (这一部分内容涉及到线性代数的很多知识,因本科纯文科,未学习过线性代数,所以暂时关注在奇异值的应用上,下来再慢慢补充学习线性代数。) Q1. 什么是…

今天学习讲义Day20的内容

奇异值SVD分解

@浙大疏锦行

(这一部分内容涉及到线性代数的很多知识,因本科纯文科,未学习过线性代数,所以暂时关注在奇异值的应用上,下来再慢慢补充学习线性代数。)

Q1. 什么是奇异值?

Q2. 奇异值的应用?

摘自讲义

奇异值分解(SVD)后,原始矩阵 $A$ 被分解为 $A = U \Sigma V^T$,这种分解是等价的,意味着通过 $U$、$\Sigma$ 和 $V^T$ 的乘积可以完全重构原始矩阵 $A$,没有任何信息损失。

但在实际应用中,我们通常不需要保留所有的奇异值和对应的向量,而是可以通过筛选规则选择排序靠前的奇异值及其对应的向量来实现降维或数据压缩。以下是这个过程的核心思想:

1. 奇异值的排序:

   - 在 $\Sigma$ 矩阵中,奇异值(对角线上的值)是按降序排列的。靠前的奇异值通常较大,代表了数据中最重要的信息或主要变化方向;靠后的奇异值较小,代表次要信息或噪声。

   - 奇异值的大小反映了对应向量对原始矩阵 $A$ 的贡献程度。

2. 筛选规则

   - 我们可以根据需求选择保留前 $k$ 个奇异值($k$ 是一个小于原始矩阵秩的数),并丢弃剩余的较小奇异值。

   - 常见的筛选规则包括:

     - 固定数量:直接选择前 $k$ 个奇异值(例如,前 10 个)。

     - 累计方差贡献率:计算奇异值的平方(代表方差),选择累计方差贡献率达到某个阈值(如 95%)的前 $k$ 个奇异值。

     - 奇异值下降幅度:观察奇异值下降的“拐点”,在下降明显变缓的地方截断。

3. 降维与近似:

   - 保留前 $k$ 个奇异值后,我们只取 $U$ 矩阵的前 $k$ 列(记为 $U_k$,尺寸为 $m \times k$)、$\Sigma$ 矩阵的前 $k$ 个奇异值(记为 $\Sigma_k$,尺寸为 $k \times k$)、以及 $V^T$ 矩阵的前 $k$ 行(记为 $V_k^T$,尺寸为 $k \times n$)。

   - 近似矩阵为 $A_k = U_k \Sigma_k V_k^T$,这个矩阵是原始矩阵 $A$ 的低秩近似,保留了主要信息,丢弃了次要信息或噪声。

   - 这种方法在降维(如主成分分析 PCA)、图像压缩、推荐系统等领域非常常用。

4. 对应的向量:

   - $U$ 的列向量和 $V$ 的列向量分别对应左右奇异向量。保留前 $k$ 个奇异值时,$U_k$ 的列向量代表数据在行空间中的主要方向,$V_k$ 的列向量代表数据在列空间中的主要方向。

   - 这些向量与奇异值一起,构成了数据的主要“模式”或“结构”。

总结:SVD 分解后原始矩阵是等价的,但通过筛选排序靠前的奇异值和对应的向量,我们可以实现降维,保留数据的主要信息,同时减少计算量和噪声影响。这种方法是许多降维算法(如 PCA)和数据处理技术的基础。

实际案例

输出解释:

- 原始矩阵 $A$ 被分解为 $U$、$\Sigma$(由 `sigma` 表示)和 $V^T$。

- 通过 $U \cdot \Sigma \cdot V^T$ 的矩阵乘法,可以完全重构原始矩阵 $A$,几乎没有信息损失(可能有非常小的数值误差)。

矩阵降维案例
import numpy as np# 创建一个矩阵 A (5x3)
A = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12],[13, 14, 15]])
print("原始矩阵 A:")
print(A)# 进行 SVD 分解
U, sigma, Vt = np.linalg.svd(A, full_matrices=False)
print("\n奇异值 sigma:")
print(sigma)# 保留前 k=1 个奇异值进行降维
k = 1
U_k = U[:, :k]  # 取 U 的前 k 列,因为要保持行数不变
sigma_k = sigma[:k]  # 取前 k 个奇异值
Vt_k = Vt[:k, :]  # 取 Vt 的前 k 行,因为要保持列数不变# 近似重构矩阵 A,常用于信号or图像筛除噪声
A_approx = U_k @ np.diag(sigma_k) @ Vt_k
print("\n保留前", k, "个奇异值后的近似矩阵 A_approx:")
print(A_approx)# 计算近似误差
error = np.linalg.norm(A - A_approx, 'fro') / np.linalg.norm(A, 'fro')
print("\n近似误差 (Frobenius 范数相对误差):", error)

打印结果

原始矩阵 A:
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12][13 14 15]]奇异值 sigma:
[3.51826483e+01 1.47690770e+00 9.86023090e-16]保留前 1 个奇异值后的近似矩阵 A_approx:
[[ 1.85152908  2.05208851  2.25264793][ 4.5411984   5.03310541  5.52501242][ 7.23086771  8.01412231  8.7973769 ][ 9.92053702 10.99513921 12.06974139][12.61020633 13.9761561  15.34210588]]近似误差 (Frobenius 范数相对误差): 0.04194136031471535

Q. 在机器学习中,如果对训练集进行 SVD 降维后训练模型,而测试集的特征数量与降维后的训练集不一致(测试集仍保持原始特征数量),该如何处理?

摘自讲义

1. 问题分析

训练集降维:假设训练集有 1000 个样本,50 个特征,通过 SVD 降维后保留 $k=10$ 个特征,得到形状为 `(1000, 10)` 的新数据。模型基于这 10 个特征进行训练。

测试集问题:测试集假设有 200 个样本,仍然是 50 个特征。如果直接输入测试集到模型中,特征数量不匹配(模型期望 10 个特征,测试集有 50 个),会导致错误。

核心问题:如何确保测试集也能被正确地降维到与训练集相同的 $k$ 个特征空间?

2. 解决方案:对测试集应用相同的变换

在机器学习中,降维(如 SVD、PCA 等)是一种数据预处理步骤。训练集和测试集必须经过**相同的变换,以确保数据分布一致。具体到 SVD,步骤如下:

训练阶段:对训练集 $X_{train}$ 进行 SVD 分解,得到 $U$, $\Sigma$, 和 $V^T$,并保存 $V^T$ 矩阵(或其前 $k$ 行)用于降维变换。

测试阶段:使用从训练集得到的 $V^T$ 矩阵,将测试集 $X_{test}$ 投影到相同的低维空间,得到降维后的测试数据。

原因:$V^T$ 矩阵定义了从原始特征空间到低维特征空间的映射关系,测试集必须使用相同的映射以保持一致性。

(数学上,假设训练集 SVD 分解为 $X_{train} = U \Sigma V^T$,我们保留前 $k$ 个奇异值对应的 $V_k^T$(形状为 $k \times 50$)。测试集降维公式为:

$$X_{test\_reduced} = X_{test} \cdot V_k^T.T$$

其中 $V_k^T.T$ 是 $V_k^T$ 的转置(形状为 $50 \times k$),$X_{test}$ 是形状为 `(n_test, 50)` 的测试集矩阵,降维后 $X_{test\_reduced}$ 的形状为 `(n_test, k)`。)

3. 为什么不能对测试集单独做 SVD?

如果对测试集单独进行 SVD,会得到不同的 $V^T$ 矩阵,导致测试集和训练集的低维空间不一致,模型无法正确处理测试数据。

训练集的 $V^T$ 矩阵代表了训练数据的特征映射规则,测试集必须遵循相同的规则,否则会引入数据泄漏或不一致性问题。

代码实现

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 设置随机种子以便结果可重复
np.random.seed(42)# 模拟数据:1000 个样本,50 个特征
n_samples = 1000
n_features = 50
X = np.random.randn(n_samples, n_features) * 10  # 随机生成特征数据
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 模拟二分类标签# 划分训练集和测试集
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')
print(f"训练集近似误差 (Frobenius 范数相对误差): {error}")

打印结果

训练集形状: (800, 50)
测试集形状: (200, 50)
Vt_train 矩阵形状: (50, 50)
保留 k=10 后的 Vt_k 矩阵形状: (10, 50)
降维后训练集形状: (800, 10)
降维后测试集形状: (200, 10)
测试集准确率: 0.595
训练集近似误差 (Frobenius 范数相对误差): 0.852479929511559

Q. 关于“近似误差”

实际操作中的注意事项

1. **标准化数据**:在进行 SVD 之前,通常需要对数据进行标准化(均值为 0,方差为 1),以避免某些特征的量纲差异对降维结果的影响。可以使用 `sklearn.preprocessing.StandardScaler`。```pythonfrom sklearn.preprocessing import StandardScalerscaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)```注意:`scaler` 必须在训练集上 `fit`,然后对测试集只用 `transform`,以避免数据泄漏。2. **选择合适的 $k$**:可以通过累计方差贡献率(explained variance ratio)选择 $k$,通常选择解释 90%-95% 方差的 $k$ 值。代码中可以计算:```pythonexplained_variance_ratio = np.cumsum(sigma_train**2) / np.sum(sigma_train**2)print(f"前 {k} 个奇异值的累计方差贡献率: {explained_variance_ratio[k-1]}")```3. **使用 sklearn 的 TruncatedSVD**:`sklearn` 提供了 `TruncatedSVD` 类,专门用于高效降维,尤其适合大规模数据。它直接计算前 $k$ 个奇异值和向量,避免完整 SVD 的计算开销。```pythonfrom sklearn.decomposition import TruncatedSVDsvd = TruncatedSVD(n_components=k, random_state=42)X_train_reduced = svd.fit_transform(X_train)X_test_reduced = svd.transform(X_test)

注:

- `scaler.fit_transform(X_train)`:在训练集上计算均值和标准差(fit),并用这些参数对训练集进行标准化(transform)。
- `scaler.transform(X_test)`:用训练集上得到的均值和标准差,对测试集进行同样的标准化变换。

这样做可以避免数据泄漏,保证测试集和训练集的标准化方式一致。如果对测试集也用fit,会用测试集自身的信息,导致评估结果不真实。

今日学习到这里,明日继续加油!!!

http://www.dtcms.com/wzjs/471207.html

相关文章:

  • 塘沽做网站app广告推广
  • 安庆做网站的公司如何查询域名注册人信息
  • 济宁建设网站制作中国十大搜索引擎排名最新
  • led网站建设持续优化完善防控措施
  • 做网站教程靠谱吗谷歌广告推广怎么做
  • jquery 苹果网站信息发布平台推广
  • 用mediawiki做的网站seo是指什么岗位
  • 嘉兴市建设街道网站营销目标分为三个方面
  • 青海网站制作哪家好广州优化网站排名
  • 点击网络怎么做网站大型网站制作
  • 临海网站制作美国婚恋网站排名
  • 网站建设论坛快速建站百度号码认证平台首页
  • 网站开发公司企业百度搜索入口网址
  • 宁夏网站建设网络营销顾问招聘
  • 电商网页设计理念免费seo
  • 威海哪里做网站设计公司
  • 做网站编辑要会什么seo链接优化建议
  • 过年做哪个网站能致富技术培训平台
  • 做网站官网好处2023年适合小学生的新闻有哪些
  • 会泽做网站危机公关
  • 创新的南昌网站制作有哪些平台可以做推广
  • 外贸 网站 seoseo网站收录工具
  • seo百科大全企业网站优化价格
  • 宁夏建设工程质量安全监督总网站谷歌seo建站
  • 河南艾特网站建设公司郑州网站推广公司电话
  • 月刊可以用什么网站做河南网站优化
  • 有关做详情页的参考网站关键词查网址
  • 物业管理软件南宁seo优化
  • 做五金建材市场的网站app拉新推广平台渠道
  • 宁津做网站网站推广seo优化