奇异值分解(SVD)

奇异值分解 (SVD)

介绍

奇异值分解 (SVD),这是最强大的矩阵分解技术之一。SVD 广泛应用于机器学习、数据科学和其他计算领域,用于降维、降噪和矩阵近似等应用。与仅适用于方阵的特征分解不同,SVD 可以应用于任何矩阵,使其成为一种多功能工具。

在这里煮啵将分解 SVD 背后的理论,通过手动计算示例进行分析,并展示如何在 Python 中实现 SVD。在本节结束时,您将清楚地了解 SVD 的强大功能及其在机器学习中的应用。

什么是 SVD?

奇异值分解是一种矩阵分解方法,将矩阵 A 分解为三个部分:
A = U Σ V T A = U \Sigma V^T A=UΣVT
在这里:

  • U U U 是正交矩阵 ( m × m m \times m m×m)
  • Σ Σ Σ 是包含奇异值的对角矩阵 ( m × n m \times n m×n)
  • V T V^T VT 是另一个正交矩阵 V ( n × n n \times n n×n) 的转置

SVD 的性质

  • 正交矩阵 U U U V V V 都是正交矩阵,即它们的列互相垂直。
  • 奇异值 Σ Σ Σ 的对角线项是矩阵 A A A 的奇异值,它们始终是非负的。
  • 应用:SVD 通常用于机器学习中的降维(PCA)、数据压缩和协同过滤。

分步示例:手动计算 SVD

为了更好地理解 SVD,让我们手动计算一个简单的 2 × 2 2 \times 2 2×2 矩阵的 SVD。

给定矩阵:
A = [ 3 2 2 3 ] A = \begin{bmatrix} 3 & 2 \\ 2 & 3 \end{bmatrix} A=[3223]
步骤 1:查找特征值和特征向量

计算“ A T A A^TA ATA”和“ A A T AA^T AAT”转置”的特征值和特征向量

第 2 步:构造 V 和 U

A T A A^TA ATA”的特征向量构成矩阵 V V V,“ A A T AA^T AAT”的特征向量构成矩阵 U U U

步骤 3:计算 Σ Σ Σ

A T A A^TA ATA”的非零特征值的平方根给出奇异值,它填充了 Σ 的对角线。

最终结果
A = U Σ V T A = U \Sigma V^T A=UΣVT

本手动示例说明了 SVD 如何将矩阵分解为其核心组件,从而揭示其结构和等级。

奇异值分解 (SVD) 结果

矩阵 A A A 的奇异值分解形式为:

A = U Σ V T A = U \Sigma V^T A=UΣVT

其中:

  • U U U V V V 是正交矩阵。
  • Σ \Sigma Σ 是对角矩阵,其对角元素为奇异值。
矩阵 U U U

U = [ 2 2 2 2 2 2 − 2 2 ] U = \begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \end{bmatrix} U=[22 22 22 22 ]

矩阵 Σ \Sigma Σ

Σ = [ 5 0 0 1 ] \Sigma = \begin{bmatrix} 5 & 0 \\ 0 & 1 \end{bmatrix} Σ=[5001]

矩阵 V V V

V = [ 2 2 2 2 2 2 − 2 2 ] V = \begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \end{bmatrix} V=[22 22 22 22 ]

说明
  • 奇异值是 σ 1 = 5 \sigma_1 = 5 σ1=5 σ 2 = 1 \sigma_2 = 1 σ2=1
  • U U U V V V 的列向量是标准正交的。
  • 可以通过计算 U Σ V T U \Sigma V^T UΣVT 验证结果等于原矩阵 A = [ 3 2 2 3 ] A = \begin{bmatrix} 3 & 2 \\ 2 & 3 \end{bmatrix} A=[3223]
  • U U U V V V 的列向量可以乘以 −1 仍满足分解,这里选择正系数形式

Python 中的 SVD(NumPy)

Python 的 NumPy 库可以轻松计算 SVD。以下是使用以下方法分解矩阵的方法numpy.linalg.svd

import numpy as np 
# 定义一个矩阵A
A = np.array ( [[ 3 , 2 ], 
              [ 2 , 3 ]]) 
# 执行SVD
U, S, Vt = np.linalg.svd ( A) 
# 显示结果
print ( "U矩阵:\n" , U) 
print ( "奇异值:" , S) 
print ( "V转置:\n" , Vt)
U 矩阵:
 [[-0.70710678 -0.70710678] 
[-0.70710678 0.70710678]]
奇异值:[ 5.  1. ] 
V 转置:
 [[-0.70710678 -0.70710678] 
[-0.70710678 0.70710678]]

重建原始矩阵

为了验证分解的正确性,我们可以使用 U U U Σ Σ Σ V T V^T VT 矩阵重建矩阵 A A A

# 重建原始矩阵 A
S_diag = np.diag(S) 
A_reconstructed = U @ S_diag @ Vt 
print( "重建矩阵 A:\n" , A_reconstructed)
U矩阵:
 [[-0.70710678 -0.70710678]
 [-0.70710678  0.70710678]]
奇异值: [5. 1.]
V转置:
 [[-0.70710678 -0.70710678]
 [-0.70710678  0.70710678]]
重建矩阵 A:
 [[3. 2.]
 [2. 3.]]

SVD 在机器学习中的应用

  1. 降维
  • SVD 用于主成分分析 (PCA),以降低数据集的维数。通过仅保留最大的奇异值(主要的特征,如在进行边缘检测时,特征点像素的边缘矩阵在求解梯度幅值时采用的就是协方差矩阵的第一特征值),我们可以压缩数据,同时保留其大部分重要结构。
  • 示例:在高维数据集上应用 SVD 并将其用于图像压缩。

2. 降噪

  • SVD 可以通过消除代表噪声成分的较小奇异值(纯纯边角料子)来帮助减少数据集中的噪声。
  • 示例:使用 SVD 对图像进行去噪。

结论

在本系列的最后一部分中,我们探讨了**奇异值分解 (SVD)**及其在机器学习中的实际应用。我们将 SVD 分解为各个组件,完成了手动示例,并在 Python 中实现了 SVD。我们还了解了如何将 SVD 应用于图像压缩和降噪等实际任务。

你可能感兴趣的:(乱七八糟,神经网络,人工智能)