机器学习入门--奇异值分解原理与实践

奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解技术,可以将一个矩阵分解为三个部分的乘积。在SVD中,原始矩阵被分解为左奇异向量矩阵、奇异值矩阵和右奇异向量矩阵的乘积。

奇异值分解数学原理

奇异值分解是一种矩阵分解技术,可以将一个矩阵分解为三个部分的乘积。在SVD中,原始矩阵被分解为左奇异向量矩阵、奇异值矩阵和右奇异向量矩阵的乘积。

具体来说,对于一个m行n列的实数矩阵A,它的SVD分解为:
A = U Σ V T A = UΣV^T A=UΣVT

其中 U U U m m m m m m列的正交矩阵,Σ是 m m m n n n列的对角矩阵, V V V n n n n n n列的正交矩阵,

SVD的数学原理如下:

  1. 首先,计算矩阵 A A A的转置矩阵 A T A^T AT A A A的乘积 A A T AA^T AAT,得到一个 m m m m m m列的对称半正定矩阵。
  2. 对矩阵 A A T AA^T AAT进行特征值分解,得到特征值和对应的特征向量。将特征向量按特征值大小排序,构成矩阵 U U U
  3. 接着,计算矩阵A的乘积 A T A A^TA ATA,得到一个n行n列的对称半正定矩阵。
  4. 对矩阵 A T A A^TA ATA进行特征值分解,得到特征值和对应的特征向量。将特征向量按特征值大小排序,构成矩阵 V V V
  5. 最后,将矩阵 A A A的奇异值(即特征值的平方根)按照降序排列,构成对角矩阵 Σ Σ Σ

通过上述过程,我们得到了矩阵 A A A的奇异值分解。在实际计算中,我们可以通过数值方法来近似计算分解结果。

代码实现

import numpy as np

def SVD(A, k=None):
    """
    对矩阵A进行奇异值分解,返回左奇异向量矩阵U、奇异值矩阵Σ和右奇异向量矩阵V。
    如果指定了k,则仅保留前k个奇异值和对应的向量。
    """
    m, n = A.shape
    U, Σ, VT = np.linalg.svd(A, full_matrices=False)
    
    if k is not None:
        U = U[:, :k]
        Σ = Σ[:k]
        VT = VT[:k, :]
    
    return U, np.diag(Σ), VT

# 示例:对一个4x3的矩阵进行SVD分解,并保留前两个奇异值及其对应向量
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
U, Σ, VT = SVD(A, k=2)
print("U =", U)
print("Σ =", Σ)
print("VT =", VT)

在上述代码中,我们采用 n u m p y numpy numpy 中的SVD函数对矩阵 A A A进行奇异值分解,并输出分解出的矩阵。

总结

本文介绍了奇异值分解(SVD)的数学原理和Python代码实现。SVD是一种矩阵分解技术,将一个矩阵分解为左奇异向量矩阵、奇异值矩阵和右奇异向量矩阵的乘积。具体来说,对于一个m行n列的实数矩阵A,它的SVD分解为 A = U Σ V T A = UΣV^T A=UΣVT
我们详细介绍了奇异值分解的数学原理,并提供了使用Python进行奇异值分解的示例代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值