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* où 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_
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)
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 gensim
sous 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
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