web-dev-qa-db-ja.com

scikit-learnでTruncated SVDからU、Sigma、V *行列を取得します

_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_
_
23
Vektor88

提供したリンクを介してソースを調べると、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)
35
maxymoo

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
10
Vektor88

ちょうどメモとして:

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 =であるため。

2
Yin

これは古い質問ですが、正しいバージョンは

U = svd.fit_transform(X)
Sigma = svd.singular_values_
VT = svd.components_

ただし、覚えておくべきことの1つは、UとVTが切り捨てられるため、残りの値がないとXを再作成できないことです。

1

ソースコードから、_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_
_
0
Cosyn