2017-01-30 5 views
0

元のデータセットを返さないTruncatedSVDに問題があります。元のデータを与えない逆切り捨てSVD

from sklearn.decomposition import TruncatedSVD 
from sklearn.random_projection import sparse_random_matrix 
X = sparse_random_matrix(100, 100, density=0.01, random_state=42) 
svd = TruncatedSVD(n_components=5, n_iter=7, random_state=42) 

t = svd.fit_transform(X.toarray()) 

print(X.toarray()) 
print(svd.inverse_transform(t)) 

予想される出力:ここではコードです

[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

与えられた出力:

[[ 4.53614251e-07 5.94986126e-09 3.56781739e-22 ..., -2.72725083e-06 
    5.13570405e-09 -2.15097572e-11] 
[ 1.79826495e-17 1.72410454e-19 2.96469642e-33 ..., -7.03013830e-17 
    3.95942333e-19 -1.41558908e-21] 
[ -2.93753794e-02 -3.74847011e-04 1.49367361e-17 ..., -3.65049683e-02 
    -1.09142571e-03 3.85158003e-06] 
..., 
[ -1.55332590e-06 -2.01895537e-08 2.49596545e-22 ..., 2.73152004e-06 
    -4.78520806e-08 1.67404008e-10] 
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 0.00000000e+00 
    0.00000000e+00 0.00000000e+00] 
[ -6.63184677e-03 -9.22742695e-05 5.28534360e-18 ..., -2.32029752e-02 
    -2.79132499e-04 1.01189068e-06]] 

ドキュメントは述べているinverse_transform():元のスペースにXを変換します。

ただし、上記の例では表示されません。

答えて

2

逆変換がに想定されていないので、切り捨てられたが、それは情報を捨てることを意味は、あなたに切り捨て分解に格納されている情報から回収することができる唯一の近似値を元のデータを与えます。

文書には、元のデータに元のデータというデータは含まれていません。これらは2つの異なる概念です。そして、あなたが持っているものは元の空間にあります(有効な次元を持っています)。

TruncatedSVD変換は関数fであり、ではなくであり、同じ表現に投影される多くのデータセットがあります。したがって、inverse_transformは変換のではなく、の逆方向での変換に過ぎません。言い換えれば、inverse_transformはg(f(X))== f(X)と同じようなgですが、g(f(X))== Xではありません。 (sqrt(x^2))^ 2(x(x))= 2となるので、それらは同じ性質を持つ。f(g(f) == x^2ですが、x = -1の場合、g(f(-1))== 1であるため、g(f(x))= xは成立しません。

関連する問題