【问题标题】:Difference between TruncatedSVD and svdsTruncatedSVD 和 svds 的区别
【发布时间】:2013-09-13 10:50:09
【问题描述】:

我看到sklearn.decomposition.TruncatedSVDscipy.sparse.linalg.svds 的文档都提到它们都对稀疏矩阵执行SVD。它们有什么区别?

谢谢。

【问题讨论】:

    标签: scipy scikit-learn svd


    【解决方案1】:

    TruncatedSVD 功能更丰富。它具有scikit-learn API,因此您可以将其放入sklearn.Pipeline 对象并在新矩阵上调用transform,而不必自己计算矩阵乘法。它提供了两种算法:一种是快速随机 SVD 求解器(默认),另一种是scipy.sparse.svds

    (完全披露:我写了TruncatedSVD。)

    【讨论】:

    • 我认为这只是令人困惑,因为名称“TruncatedSVD”似乎暗示它可能根本不使用标准的 SVD 方法。根据您的回答,听起来这实际上只是核心的 SVD?
    • @JasonF SciPy 的svds 一个截断的 SVD 求解器。它无法计算完整的 SVD;输入中列数中的最大组件数减一。
    • 我可以从中得到 U,S,V 矩阵吗?想不通。
    【解决方案2】:

    也有人这样做

    #check how to use TRuncatedSVD
    X=[[1,2,3],[1,4,2],[4,1,7],[5,6,8]]
    
    # TRUNCATED SVD
    from sklearn.decomposition import TruncatedSVD
    svd = TruncatedSVD(n_components=2, n_iter=7, random_state=42)
    
    US=svd.fit_transform(X)
    
    V=svd.components_
    S=svd.singular_values_ 
    print('u,s,v', US,S,V)
    print('X_restored dot way',np.round(np.dot(US,V),1),'svdinverse way',np.round(svd.inverse_transform(U),1))
    
    # LINALG SVD
    
    U1,S1,V1=np.linalg.svd(X)
    
    print('u1,s1,v1 remark negative mirrored',U1[:,:2]*S1[:2],V1[:2,:])
    print('X restored u1,s1,v1, 2 components',np.round( np.dot( U1[:,:2]*S1[:2],V1[:2,:] ),1 ) ) 
    
    # sparse svd
    from scipy.sparse import csc_matrix
    from scipy.sparse.linalg import svds, eigs
    A = csc_matrix(X, dtype=float)
    
    u2, s2, vt2 = svds(A, k=2)
    
    print('sparse reverses !',u2*s2,vt2)
    print('x restored',np.round( np.dot(u2*s2,vt2),1) )
    

    结果

        u,s,v [[ 3.66997034 -0.34754761]
     [ 3.82764223 -2.51681397]
     [ 7.61154768  2.83860088]
     [11.13470337 -0.96070751]] [14.49264657  3.92883644] [[ 0.44571865  0.46215842  0.76664495]
     [ 0.23882889 -0.88677195  0.39572247]]
    X_restored dot way
     [[1.6 2.  2.7]
     [1.1 4.  1.9]
     [4.1 1.  7. ]
     [4.7 6.  8.2]]
    svdinverse way
     [[1.6 2.  2.7]
     [1.1 4.  1.9]
     [4.1 1.  7. ]
     [4.7 6.  8.2]]
    u1,s1,v1 remark negative mirrored
     [[ -3.66997034   0.34754761]
     [ -3.82764223   2.51681397]
     [ -7.61154768  -2.83860088]
     [-11.13470337   0.96070751]] [[-0.44571865 -0.46215842 -0.76664495]
     [-0.23882889  0.88677195 -0.39572247]]
    X restored u1,s1,v1, 2 components
     [[1.6 2.  2.7]
     [1.1 4.  1.9]
     [4.1 1.  7. ]
     [4.7 6.  8.2]]
    sparse reverses !
     [[-0.34754761  3.66997034]
     [-2.51681397  3.82764223]
     [ 2.83860088  7.61154768]
     [-0.96070751 11.13470337]]
     [[ 0.23882889 -0.88677195  0.39572247]
     [ 0.44571865  0.46215842  0.76664495]]
    x restored
     [[1.6 2.  2.7]
     [1.1 4.  1.9]
     [4.1 1.  7. ]
     [4.7 6.  8.2]]
    [[-0.25322982  0.0884607   0.88223679]
     [-0.26410926  0.64060034  0.16752502]
     [-0.52520067 -0.72250421  0.11259767]
     [-0.76830021  0.24452723 -0.42534148]]
     [14.49264657  3.92883644  0.72625043]
     [[-0.44571865 -0.46215842 -0.76664495]
     [-0.23882889  0.88677195 -0.39572247]
     [-0.86272571 -0.00671608  0.50562757]]
     [[1. 2. 3.]
     [1. 4. 2.]
     [4. 1. 7.]
     [5. 6. 8.]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 2014-01-08
      • 2014-01-01
      • 2016-07-15
      • 2013-08-07
      • 2011-10-20
      • 2020-01-23
      • 1970-01-01
      相关资源
      最近更新 更多