Obtenir U, Sigma, V* matrice de Tronqués SVD dans scikit-learn

j'utilise SVD tronqué de scikit-learn paquet.

dans la définition de SVD, une matrice originale est approxmated comme un produit UΣV* U et V ont des colonnes orthonormales, et Σ est diagonale non négative.

j'ai besoin d'obtenir l' U, Σ et V* matrices.

regarder le code source ici j'ai trouvé que V* est stocké dans self.components_ champ après l'appel de fit_transform.

Est-il possible d'obtenir U et Σ matrices?

mon code:

import sklearn.decomposition as skd
import numpy as np

matrix = np.random.random((20,20))
trsvd = skd.TruncatedSVD(n_components=15)
transformed = trsvd.fit_transform(matrix)
VT = trsvd.components_
17
demandé sur maxymoo 2015-07-20 21:18:17

3 réponses

regarder dans la source via le lien que vous avez fourni,TruncatedSVD est en fait un enveloppement autour de sklearn.utils.extmath.randomized_svd; vous pouvez l'appeler manuellement vous-même comme ceci:

from sklearn.utils.extmath import randomized_svd

U, Sigma, VT = randomized_svd(X, 
                              n_components=15,
                              n_iter=5,
                              random_state=None)
29
répondu maxymoo 2017-04-18 00:50:12

On peut utiliser scipy.clairsemé.svds (pour les matrices denses, vous pouvez utiliser svd).

import numpy as np
from scipy.sparse.linalg import svds

matrix = np.random.random((20, 20))
num_components = 2
u, s, v = svds(matrix, k=num_components)
X = u.dot(np.diag(s))  # output of TruncatedSVD

si vous travaillez avec de très grandes matrices éparses (peut-être votre travail avec du texte naturel), même scipy.sparse.svds pourrait faire exploser la mémoire vive de votre ordinateur. Dans de tels cas, envisager l' sparsesvd package qui utilise SVDLIBC et gensimsous le capot.

import numpy as np
from sparsesvd import sparsesvd


X = np.random.random((30, 30))
ut, s, vt = sparsesvd(X.tocsc(), k)
projected = (X * ut.T)/s
8
répondu Vektor88 2017-06-27 06:58:41

supposons que X soit notre matrice d'entrée sur laquelle nous voulons que yo exécute SVD tronqué. Les commandes ci-dessous aident à trouver le U, Sigma et VT :

    from sklearn.decomposition import TruncatedSVD

    SVD = TruncatedSVD(n_components=r) 
    U = SVD.fit_transform(X)
    Sigma = SVD.explained_variance_ratio_
    VT = SVD.components_
    #r corresponds to the rank of the matrix

pour comprendre les termes ci-dessus, veuillez vous référer à http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html

-2
répondu Manika Agarwal 2016-06-09 16:40:30