surprise ridge instalar python scipy scikit-learn sparse-matrix svd

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 AUΣ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