• 机器学习基础:奇异值分解(SVD)


    SVD 原理

    奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,也是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。

    有一个×的实数矩阵,我们想要把它分解成如下的形式:$A = U\Sigma V^T$

    其中和均为单位正交阵,即有$=$和$=$,称为左奇异矩阵,称为右奇异矩阵,Σ仅在主对角线上有值,我们称它为奇异值,其它元素均为0。

    上面矩阵的维度分别为$U \in R^{m\times m}$,$\ \Sigma \in R^{m\times n}$,$\ V \in R^{n\times n}$。

    一般地Σ有如下形式
    $$
    \Sigma =
    \left[
    \begin{matrix}
    \sigma_1 & 0 & 0 & 0 & 0\
    0 & \sigma_2 & 0 & 0 & 0\
    0 & 0 & \ddots & 0 & 0\
    0 & 0 & 0 & \ddots & 0\
    \end{matrix}
    \right]_{m\times n}
    $$

    $_$ 越大意味着对应的 $′$ 的特征值 $\sigma_j^2$ 越大, 从而其主成分 (principal component) $_$ 的样本方差越大, 我们把方差大视为提供了更多信息.

    求解U, Σ, V

    假设我们的矩阵A是一个m×n的矩阵,则$A^TA$是方阵,求其特征值及特征向量:

    $(A^TA)v_i = \lambda_i v_i$

    得到矩阵$A^TA$的n个特征值和对应的n个特征向量$v$


    $ATA=V\SigmaTU^TU\Sigma V^T$ =$V\Sigma^T\Sigma V^T= V\Sigma2VT$

    将特征向量$v$张成一个$n×n$的矩阵$V$,就是SVD公式里面的$V$矩阵,$V$中的每个特征向量叫做$A$的右奇异向量。

    同理:$(AA^T)u_i = \lambda_i u_i$,可得$U$矩阵。

    求得$U , V$,然后求Σ,因Σ为奇异值矩阵,所以只需要求出每个奇异值$σ$即可。

    $A=U\Sigma V^T \Rightarrow AV=U\Sigma V^TV \Rightarrow $

    $AV=U\Sigma \Rightarrow Av_i = \sigma_i u_i \Rightarrow \sigma_i=Av_i / u_i$

    其实特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:

    $\sigma_i = \sqrt{\lambda_i}$

    所以不用$\sigma_i = Av_i / u_i$也可以通过求出$A^TA$的特征值取平方根来求奇异值。

    SVD算法


    输入:样本数据
    输出:左奇异矩阵,奇异值矩阵,右奇异矩阵

    1 计算特征值: 特征值分解$AA^T$,其中$A \in \mathbf{R}^{m\times n}$为原始样本数据
    $AA^T=U\Sigma \SigmaTUT$

    得到左奇异矩阵$U \in \mathbf{R}^{m \times m}$和奇异值矩阵$\Sigma' \in \mathbf{R}^{m \times m}$

    2 间接求部分右奇异矩阵: 求$V' \in \mathbf{R}^{m \times n}$

    利用A=UΣ′V′可得

    $V' = (U\Sigma')^{-1}A = (\Sigma'){-1}UTA$

    3 返回U, Σ′, V′,分别为左奇异矩阵,奇异值矩阵,右奇异矩阵。


    Python 求解SVD

    from numpy import array
    from numpy import diag
    from numpy import zeros
    from scipy.linalg import svd
    # define a matrix
    A = array([
    	[1,2,3,4,5,6,7,8,9,10],
    	[11,12,13,14,15,16,17,18,19,20],
    	[21,22,23,24,25,26,27,28,29,30]])
    print(A)
    
    >>> A
    array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
           [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
           [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]])
    
    # Singular-value decomposition
    U, s, VT = svd(A)
    # create m x n Sigma matrix
    Sigma = zeros((A.shape[0], A.shape[1]))
    # populate Sigma with n x n diagonal matrix
    Sigma[:A.shape[0], :A.shape[0]] = diag(s)
    # select
    n_elements = 2
    Sigma = Sigma[:, :n_elements]
    VT = VT[:n_elements, :]
    # reconstruct
    B = U.dot(Sigma.dot(VT))
    print(B)
    
    >>> B
    array([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
           [11., 12., 13., 14., 15., 16., 17., 18., 19., 20.],
           [21., 22., 23., 24., 25., 26., 27., 28., 29., 30.]])
    
    # transform
    T = U.dot(Sigma)
    print(T)
    
    >>> T
    array([[-18.52157747,   6.47697214],
           [-49.81310011,   1.91182038],
           [-81.10462276,  -2.65333138]])
    
    T = A.dot(VT.T)
    print(T)
    
    [[-18.52157747   6.47697214]
     [-49.81310011   1.91182038]
     [-81.10462276  -2.65333138]]
    

    参考:
    https://www.cnblogs.com/pinard/p/6251584.html
    https://www.cnblogs.com/endlesscoding/p/10033527.html

  • 相关阅读:
    SAP字符串处理
    ABAP更换请求
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
    Odoo安装教程11-创建新的插件模块之设置访问权限
    SAP是什么?-SAP 各模块概览
    SAP是什么?-SAP 各产品释义
    SAP版本演进及区别-S/4 HANA 与R3(ECC)
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
  • 原文地址:https://www.cnblogs.com/jpld/p/16152065.html
Copyright © 2020-2023  润新知