用deepseek学大模型02-数学基础 奇异值分解(Singular Value Decomposition,简称SVD)
奇异值分解(SVD)是一种强大的线性代数工具,不仅在理论上有重要意义,还在实际应用中展现了广泛的应用价值。通过学习SVD,可以更好地理解矩阵的性质及其在深度学习中的作用。希望以上内容能帮助你掌握SVD的基础知识,并理解其在深度学习中的重要性。SVD(奇异值分解)是一种重要的降维技术,广泛应用于多个领域,包括推荐系统、图像处理、文本挖掘等。SVD作为一种经典的降维技术,因其简单性和高效性,在多个领域
https://metaso.cn/s/IPoJ6Qq
提示词
我正在学习大模型,第一步是掌握大模型的数学基础, 我想学习如下内容,教教我:
线性代数里矩阵奇异值分解SVD,讲解要清晰且给出例题。阵奇异值分解SVD在深度学习中有什么应用?
参考:https://blog.csdn.net/u012968002/article/details/91355138
奇异值分解(Singular Value Decomposition,简称SVD)是线性代数中一种重要的矩阵分解方法,广泛应用于深度学习、机器学习、图像处理等领域。以下将从SVD的基本概念、计算方法、例题以及在深度学习中的应用进行详细讲解。
一、奇异值分解(SVD)的基本概念
对于任意一个 m×nm \times nm×n 的实数矩阵 AAA,可以将其分解为三个矩阵的乘积:
A=UΣVT A = U \Sigma V^T A=UΣVT
其中:
- UUU 是一个 m×mm \times mm×m 的正交矩阵,称为左奇异矩阵;
- Σ\SigmaΣ 是一个 m×nm \times nm×n 的对角矩阵,对角线上的元素称为奇异值,且这些奇异值按从大到小排列;
- VVV 是一个 n×nn \times nn×n 的正交矩阵,称为右奇异矩阵。
具体来说:
- 左奇异向量:UUU 的列向量是矩阵 ATAA^TAATA 的特征向量;
- 右奇异向量:VVV 的列向量是矩阵 AATAA^TAAT 的特征向量;
- 奇异值:Σ\SigmaΣ 对角线上的元素是 ATAA^TAATA 和 AATAA^TAAT 的特征值的平方根。

二、SVD的计算方法
- 标准SVD:通过求解矩阵 ATAA^TAATA 和 AATAA^TAAT 的特征值和特征向量,得到 UUU、Σ\SigmaΣ 和 VVV。
- Python实现:可以使用科学计算库如NumPy或MATLAB中的内置函数来计算SVD。例如:
import numpy as np
A = np.array()

U, S, Vt = np.linalg.svd(A)
print("U:", U)
print("S:", S)
print("V^T:", Vt)
三、SVD的例题
假设有一个矩阵 A=[1234]A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}A=[1324],求其SVD分解。
步骤:
- 计算 ATA=[1324][1234]=[10111120]A^TA = \begin{bmatrix} 1 & 3 \\ 2 & 4 \end{bmatrix} \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} = \begin{bmatrix} 10 & 11 \\ 11 & 20 \end{bmatrix}ATA=[1234][1324]=[10111120];
- 求解特征值和特征向量,得到特征值为 λ1=29.75\lambda_1 = 29.75λ1=29.75 和 λ2=0.26\lambda_2 = 0.26λ2=0.26;
- 计算对应的奇异值为 σ1=λ1=5.45\sigma_1 = \sqrt{\lambda_1} = 5.45σ1=λ1=5.45 和 σ2=λ2=0.51\sigma_2 = \sqrt{\lambda_2} = 0.51σ2=λ2=0.51;
- 计算 UUU 和 VVV 的列向量,最终得到:
U=[−0.44−0.89−0.890.44],Σ=[5.45000.51],V=[−0.82−0.57−0.570.82] U = \begin{bmatrix} -0.44 & -0.89 \\ -0.89 & 0.44 \end{bmatrix}, \quad \Sigma = \begin{bmatrix} 5.45 & 0 \\ 0 & 0.51 \end{bmatrix}, \quad V = \begin{bmatrix} -0.82 & -0.57 \\ -0.57 & 0.82 \end{bmatrix} U=[−0.44−0.89−0.890.44],Σ=[5.45000.51],V=[−0.82−0.57−0.570.82]
[[线性代数矩阵奇异值分解SVD计算步骤流程图]]
四、SVD在深度学习中的应用
- 降维与特征提取:通过截断部分较小的奇异值,可以实现矩阵的低秩近似,从而降低数据维度。例如,在自然语言处理中,通过SVD可以提取文本数据的潜在语义信息。
- 图像压缩:利用SVD分解图像矩阵,可以去除噪声并保留主要特征。例如,通过只保留前几个奇异值,可以重建图像的主要部分。
- 推荐系统:在推荐系统中,通过SVD分解用户-物品评分矩阵,可以预测用户对未评分物品的喜好。
- 神经网络优化:在深度学习中,SVD可以用于简化神经网络的权重矩阵,减少参数数量,降低过拟合风险。
- 数据去噪:通过去除低奇异值,可以有效减少数据中的噪声,同时保留重要信息。
[[线性代数矩阵奇异值分解SVD在深度学习中的应用示意图]]
五、总结
奇异值分解(SVD)是一种强大的线性代数工具,不仅在理论上有重要意义,还在实际应用中展现了广泛的应用价值。通过学习SVD,可以更好地理解矩阵的性质及其在深度学习中的作用。希望以上内容能帮助你掌握SVD的基础知识,并理解其在深度学习中的重要性。
deepseek.com: 举个SVD分解的例题,和详细的计算过程。要求至少是3*3的矩阵。
SVD(奇异值分解)是一种重要的降维技术,广泛应用于多个领域,包括推荐系统、图像处理、文本挖掘等。以下是一些具体的SVD降维应用实例:
1. 推荐系统
SVD在推荐系统中被广泛用于构建用户和物品的隐式特征向量,从而计算用户或物品之间的相似度。例如:
- 在协同过滤推荐系统中,通过SVD将用户-项目评分矩阵分解为三个较小的矩阵,提取出用户和项目的潜在特征,从而实现高效的推荐。
- 使用SVD降维处理相似度函数,可以基于物品的相似度进行推荐,如计算欧氏距离、皮尔逊相关系数等。
2. 图像处理
SVD在图像降噪和压缩中具有重要作用:
-
通过SVD分解图像矩阵,可以去除噪声并保留主要特征。例如,在图像压缩中,仅保留前k个奇异值,可以显著减少存储需求,同时保持图像的近似质量。

-
在高光谱图像处理中,SVD被用于实时降维,以提高处理效率。
3. 文本挖掘与信息检索
SVD在文本挖掘中用于提取文本数据中的主题或潜在语义结构:
- 通过SVD分解文档-词矩阵,可以提取文档的主题信息,从而提高文档搜索的效率和准确性。
- 在语义消歧任务中,SVD被用于将语料库中的词向量映射到低维空间,以减少目标词与上下文之间的距离。
4. 生物信息学
在生物信息学中,SVD被用于简化复杂的生物过程模型:
- 通过删除对系统输出贡献最小的反应,SVD帮助降低模型复杂度,从而揭示生物过程的核心模式。
5. 工业故障诊断
SVD在工业故障诊断中用于处理高维数据:
- 通过降维,SVD帮助区分正常运行数据与故障数据,从而实现故障的早期检测。
6. 人脸识别
SVD在人脸识别中用于提取面部特征:
- 通过对图像向量进行SVD分解,可以提取面部特征并实现高效的识别。
7. 其他应用
- 信号处理:SVD被用于降噪和特征提取。
- 主题建模:SVD用于潜在语义分析(LSA),以提取文档的主题结构。
- 数据压缩:在需要压缩或近似大型数据集时,SVD是一种有效的降维方法。
实例代码
以下是一个使用Python实现SVD降维的简单示例:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.decomposition import TruncatedSVD
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
# 使用TruncatedSVD进行降维
svd = TruncatedSVD(n_components=2) # 将数据降维到2维
X_svd = svd.fit_transform(X)
print("降维后的数据形状:", X_svd.shape)
此代码展示了如何将鸢尾花数据集从4维降维到2维。
总结
SVD作为一种经典的降维技术,因其简单性和高效性,在多个领域得到了广泛应用。它不仅可以减少数据的维度,还能保留大部分重要信息,从而提高算法的运行效率和结果的可解释性。然而,SVD也存在计算复杂度高、对缺失值敏感等局限性。
以下是一个关于奇异值分解(SVD)的例题及其详细计算过程:
例题:对矩阵
A=[101010101]A = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}A=⎣⎡101010101⎦⎤
进行奇异值分解。
计算过程
步骤1:计算 ATAA^T AATA
AT=[101010101],ATA=[202010202]A^T = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}, \quad A^T A = \begin{bmatrix} 2 & 0 & 2 \\ 0 & 1 & 0 \\ 2 & 0 & 2 \end{bmatrix}AT=⎣⎡101010101⎦⎤,ATA=⎣⎡202010202⎦⎤
步骤2:求 ATAA^T AATA 的特征值和特征向量
特征方程:det(ATA−λI)=0\det(A^T A - \lambda I) = 0det(ATA−λI)=0。
展开行列式:
(1−λ)[(2−λ)2−4]=0 ⟹ λ=1,4,0. (1-\lambda)\left[(2-\lambda)^2 - 4\right] = 0 \implies \lambda = 1, 4, 0. (1−λ)[(2−λ)2−4]=0⟹λ=1,4,0.
-
特征值 (\lambda = 4):
解方程 ((A^T A - 4I)\mathbf{v} = 0):
{−2x+2z=0−3y=02x−2z=0 ⟹ v1=12[101]. \begin{cases} -2x + 2z = 0 \\ -3y = 0 \\ 2x - 2z = 0 \end{cases} \implies \mathbf{v}_1 = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 0 \\ 1 \end{bmatrix}. ⎩⎪⎨⎪⎧−2x+2z=0−3y=02x−2z=0⟹v1=21⎣⎡101⎦⎤. -
特征值 (\lambda = 1):
解方程 (ATA−I)v=0(A^T A - I)\mathbf{v} = 0(ATA−I)v=0:
{x+2z=02x+z=0y任意 ⟹ v2=[010]. \begin{cases} x + 2z = 0 \\ 2x + z = 0 \\ y \text{任意} \end{cases} \implies \mathbf{v}_2 = \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix}. ⎩⎪⎨⎪⎧x+2z=02x+z=0y任意⟹v2=⎣⎡010⎦⎤. -
特征值 λ=0\lambda = 0λ=0:
解方程 ATAv=0A^T A \mathbf{v} = 0ATAv=0:
{2x+2z=0y=0 ⟹ v3=12[−101]. \begin{cases} 2x + 2z = 0 \\ y = 0 \end{cases} \implies \mathbf{v}_3 = \frac{1}{\sqrt{2}} \begin{bmatrix} -1 \\ 0 \\ 1 \end{bmatrix}. {2x+2z=0y=0⟹v3=21⎣⎡−101⎦⎤.
构造正交矩阵 VVV:
V=[120−1201012012]. V = \begin{bmatrix} \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}} \\ 0 & 1 & 0 \\ \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \end{bmatrix}. V=⎣⎡21021010−21021⎦⎤.
步骤3:计算奇异值并构造 (\Sigma)
奇异值为特征值的平方根:
σ1=4=2,σ2=1=1,σ3=0. \sigma_1 = \sqrt{4} = 2, \quad \sigma_2 = \sqrt{1} = 1, \quad \sigma_3 = 0. σ1=4=2,σ2=1=1,σ3=0.
构造对角矩阵 (\Sigma):
Σ=[200010000]. \Sigma = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix}. Σ=⎣⎡200010000⎦⎤.
步骤4:计算矩阵 UUU
利用公式 ui=1σiAvi\mathbf{u}_i = \frac{1}{\sigma_i} A \mathbf{v}_iui=σi1Avi:
-
对于 σ1=2\sigma_1 = 2σ1=2:
u1=12Av1=12[101]. \mathbf{u}_1 = \frac{1}{2} A \mathbf{v}_1 = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 0 \\ 1 \end{bmatrix}. u1=21Av1=21⎣⎡101⎦⎤. -
对于 σ2=1\sigma_2 = 1σ2=1:
u2=Av2=[010]. \mathbf{u}_2 = A \mathbf{v}_2 = \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix}. u2=Av2=⎣⎡010⎦⎤. -
对于 σ3=0\sigma_3 = 0σ3=0,通过正交化补充基向量:
u3=12[10−1]. \mathbf{u}_3 = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 0 \\ -1 \end{bmatrix}. u3=21⎣⎡10−1⎦⎤.
构造正交矩阵 UUU:
U=[12012010120−12]. U = \begin{bmatrix} \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\ 0 & 1 & 0 \\ \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}} \end{bmatrix}. U=⎣⎡21021010210−21⎦⎤.
最终SVD分解
A=UΣVT=[12012010120−12][200010000][12012010−12012]T. A = U \Sigma V^T = \begin{bmatrix} \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\ 0 & 1 & 0 \\ \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix} 2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\ 0 & 1 & 0 \\ -\frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \end{bmatrix}^T. A=UΣVT=⎣⎡21021010210−21⎦⎤⎣⎡200010000⎦⎤⎣⎡210−2101021021⎦⎤T.
验证:计算 UΣVTU \Sigma V^TUΣVT 可恢复原矩阵 AAA。
deepseek.com:举个SVD分解的例题,和详细的计算过程。要求至少是3*3的矩阵。
在 numpy 中,TruncatedSVD 是一种基于奇异值分解(SVD)的降维方法,通常用于将高维数据降维到较低的维度,同时保留数据的主要特征。它的核心思想是通过截断奇异值分解,保留最重要的奇异值和对应的奇异向量,从而实现降维。
TruncatedSVD 的原理
-
奇异值分解(SVD):
对于任意矩阵 AAA(大小为 m×nm \times nm×n),SVD 将其分解为:
A=UΣVT A = U \Sigma V^T A=UΣVT- UUU 是 m×mm \times mm×m 的正交矩阵(左奇异向量)。
- Σ\SigmaΣ 是 m×nm \times nm×n 的对角矩阵,对角线上的元素是奇异值(按从大到小排列)。
- VTV^TVT 是 n×nn \times nn×n 的正交矩阵(右奇异向量)。
-
截断 SVD:
TruncatedSVD 通过保留前 kkk 个最大的奇异值及其对应的奇异向量,将矩阵 AAA 近似表示为:
A≈UkΣkVkT A \approx U_k \Sigma_k V_k^T A≈UkΣkVkT- UkU_kUk 是 m×km \times km×k 的矩阵(前 kkk 个左奇异向量)。
- Σk\Sigma_kΣk 是 k×kk \times kk×k 的对角矩阵(前 kkk 个奇异值)。
- VkTV_k^TVkT 是 k×nk \times nk×n 的矩阵(前 kkk 个右奇异向量)。
-
降维:
通过截断 SVD,原始数据 AAA 被降维到 kkk 维空间:- 降维后的数据表示为 UkΣkU_k \Sigma_kUkΣk(大小为 m×km \times km×k)。
- 降维后的特征空间由 VkTV_k^TVkT 定义。
TruncatedSVD 的实现方法
在 numpy 中,可以通过以下步骤实现 TruncatedSVD:
1. 使用 numpy.linalg.svd 进行 SVD 分解
import numpy as np
# 示例矩阵
A = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]])
# 进行 SVD 分解
U, S, Vt = np.linalg.svd(A, full_matrices=False)
# 选择前 k 个奇异值和对应的奇异向量
k = 2 # 降维到 2 维
U_k = U[:, :k]
S_k = np.diag(S[:k])
Vt_k = Vt[:k, :]
# 降维后的数据
A_reduced = U_k @ S_k
print("降维后的数据:\n", A_reduced)
2. 使用 sklearn.decomposition.TruncatedSVD
scikit-learn 提供了 TruncatedSVD 类,可以直接用于降维:
from sklearn.decomposition import TruncatedSVD
# 示例矩阵
A = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]])
# 创建 TruncatedSVD 对象,降维到 2 维
svd = TruncatedSVD(n_components=2)
# 拟合数据并降维
A_reduced = svd.fit_transform(A)
print("降维后的数据:\n", A_reduced)
TruncatedSVD 的参数说明
在 scikit-learn 的 TruncatedSVD 中,常用参数包括:
n_components:降维后的维度 kkk。algorithm:SVD 求解算法,可选'arpack'或'randomized'。n_iter:随机算法的迭代次数(仅当algorithm='randomized'时有效)。
TruncatedSVD 的应用场景
-
文本数据的降维:
- 在自然语言处理中,TF-IDF 矩阵通常非常高维,TruncatedSVD 可以将其降维到较低的维度,同时保留主要语义信息。
-
图像压缩:
- 通过截断 SVD,可以将图像数据压缩到较低的维度,减少存储空间。
-
特征提取:
- 在高维数据中,TruncatedSVD 可以提取最重要的特征,用于后续的机器学习任务。
总结
TruncatedSVD 是一种基于 SVD 的降维方法,通过保留前 kkk 个奇异值和对应的奇异向量,将高维数据降维到 kkk 维。它在 numpy 和 scikit-learn 中都有实现,适用于文本、图像等高维数据的降维和特征提取。
更多推荐


所有评论(0)