_scikit-learn
_ packageから切り捨てられたSVDを使用しています。
SVDの定義では、元の行列[〜#〜] a [〜#〜]は製品[〜#〜] a [〜#〜]≈UΣV*where[〜#〜] u [〜#〜]および[〜#〜] v [〜#〜]正規直交列を持ち、Σは非負の対角線です。
[〜#〜] u [〜#〜]、ΣおよびV *行列。
ソースコードを見る here 私は、V *が_self.components_
_フィールドに_fit_transform
_。
[〜#〜] u [〜#〜]andΣ行列?
私のコード:
_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_
_
提供したリンクを介してソースを調べると、TruncatedSVD
は基本的にsklearn.utils.extmath.randomized_svdのラッパーです。このように自分で手動で呼び出すことができます:
from sklearn.utils.extmath import randomized_svd
U, Sigma, VT = randomized_svd(X,
n_components=15,
n_iter=5,
random_state=None)
scipy.sparse.svds を使用できます(密行列の場合は 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
本当に大きなスパース行列を使用している場合(おそらく自然なテキストを使用している場合)、scipy.sparse.svds
は、コンピューターのRAMを爆破する可能性があります。そのような場合、 [〜#〜] svdlibc [〜#〜] を使用する sparsesvd パッケージ、およびgensim
が使用するもの nder -the-hood 。
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
ちょうどメモとして:
svd.transform(X)
そして
svd.fit_transform(X)
* Sigmaを生成します。
svd.singular_values_
ベクトル形式でSigmaを生成します。
svd.components_
[〜#〜] vt [〜#〜]を生成します。たぶん使用できます
svd.transform(X).dot(np.linalg.inv(np.diag(svd.singular_values_)))
[〜#〜] u [〜#〜]を取得するには* Sigma * Sigma ^ -1 = U * I =であるため。
これは古い質問ですが、正しいバージョンは
U = svd.fit_transform(X)
Sigma = svd.singular_values_
VT = svd.components_
ただし、覚えておくべきことの1つは、UとVTが切り捨てられるため、残りの値がないとXを再作成できないことです。
ソースコードから、_X_transformed
_は_U * Sigma
_(ここではSigma
はベクトルです)である_fit_transform
_メソッドから返されることがわかります。だから我々は得ることができます
_svd = TruncatedSVD(k)
X_transformed = svd.fit_transform(X)
U = X_transformed / svd.singular_values_
Sigma_matrix = np.diag(svd.singular_values_)
VT = svd.components_
_
備考
切り捨てられたSVDは近似値です。 X≈X '=UΣV*。 X'V =UΣです。しかし、XVはどうですか?興味深い事実は、XV = X'Vです。これは、Xの完全なSVD形式とX 'の短縮SVD形式を比較することで証明できます。 XVはtransform(X)
にすぎないため、U
も取得できます。
_U = svd.transform(X) / svd.singular_values_
_