奇异值分解 (SVD),这是最强大的矩阵分解技术之一。SVD 广泛应用于机器学习、数据科学和其他计算领域,用于降维、降噪和矩阵近似等应用。与仅适用于方阵的特征分解不同,SVD 可以应用于任何矩阵,使其成为一种多功能工具。
在这里煮啵将分解 SVD 背后的理论,通过手动计算示例进行分析,并展示如何在 Python 中实现 SVD。在本节结束时,您将清楚地了解 SVD 的强大功能及其在机器学习中的应用。
奇异值分解是一种矩阵分解方法,将矩阵 A 分解为三个部分:
A = U Σ V T A = U \Sigma V^T A=UΣVT
在这里:
为了更好地理解 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
矩阵 A A A 的奇异值分解形式为:
A = U Σ V T A = U \Sigma V^T A=UΣVT
其中:
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=[222222−22]
Σ = [ 5 0 0 1 ] \Sigma = \begin{bmatrix} 5 & 0 \\ 0 & 1 \end{bmatrix} Σ=[5001]
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=[222222−22]
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.]]
2. 降噪
在本系列的最后一部分中,我们探讨了**奇异值分解 (SVD)**及其在机器学习中的实际应用。我们将 SVD 分解为各个组件,完成了手动示例,并在 Python 中实现了 SVD。我们还了解了如何将 SVD 应用于图像压缩和降噪等实际任务。