python - ridge - Obtenga la matriz U, Sigma, V*de la SVD Truncada en scikit-learn
surprise github (3)
Al examinar la fuente a través del enlace que proporcionó, TruncatedSVD
básicamente es un contenedor alrededor de sklearn.utils.extmath.randomized_svd; Puedes llamarlo así manualmente de esta manera:
from sklearn.utils.extmath import randomized_svd
U, Sigma, VT = randomized_svd(X,
n_components=15,
n_iter=5,
random_state=None)
Estoy usando SVD truncado del paquete scikit-learn
.
En la definición de SVD, una matriz original A se aproxima como un producto A ≈ UΣV * donde U y V tienen columnas ortonormales, y Σ es diagonal no negativa.
Necesito obtener las matrices U , Σ y V * .
Al mirar el código fuente aquí , descubrí que V * está almacenado en el campo self.compoments_
después de llamar a fit_transform
.
¿Es posible obtener matrices U y??
Mi código:
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_
Supongamos que X es nuestra matriz de entrada en la que queremos que realice la SVD truncada. Los comandos a continuación ayudan a descubrir U, Sigma y 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
Para comprender los términos anteriores, consulte http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html
Uno puede usar scipy.sparse.svds (para matrices densas puedes usar 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 está trabajando con matrices realmente grandes y dispersas (quizás trabajando con texto natural), incluso scipy.sparse.svds
podría explotar la memoria RAM de su computadora. En tales casos, considere el paquete sparsesvd que usa SVDLIBC , y lo que gensim
usa debajo del capó .
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