2017-03-02 16 views
0

私はsklearnのTruncatedSVDクラスを使用してより低い次元に分解しようとしている行列を持っています。コンストラクタのn_components引数については、私は500を渡しています。しかし、fit_transformメソッドによって返されたデータフレームの形状をチェックすると、列の数は500とは異なります。これを引き起こす原因はわかりません。ここではコード -不適切な寸法を返す切り捨てられたSVD

# ORIGINAL DATAFRAME 
tfidf_df.shape #(277, 51023) 

# INITIALIZE SVD DECOMPOSER 
svd_decomposer = TruncatedSVD(n_components=500, # Desired dimensionality of output data 
algorithm='randomized', # SVD solver to use 
n_iter=5, # Number of iterations for randomized SVD solver 
random_state=42, # pseudo-random number generator 
tol=0.0 # Tolerance for ARPACK 
) 
svd_decomposer.n_components #500 

# DECOMPOSE THE DATAFRAME 
tfidf_svd = svd_decomposer.fit_transform(tfidf_df) 
tfidf_svd.shape # (277, 277) 

は、出力データフレームtfidf_svdは形状(277, 500)ですべきではないです。ここで間違っていることを私は理解できません。

答えて

2

これは予想される動作です。 TruncatedSVD機能は、次のコードがあることを内部randomized_svd関数を呼び出して:

if transpose == 'auto': 
    transpose = n_samples < n_features 
if transpose: 
    # this implementation is a bit faster with smaller shape[1] 
    M = M.T 

だから、あなたが返すことができるようになりますコンポーネントの最大数は、使用しているサンプルの数です。なぜ私は正確に覚えていませんが、あなたが保存するサンプルの数に制限されている理由について、線形代数の説明があることは間違いありません。 SVDの両方の実装でscigitで同じ動作が見られます。

EDIT

hereから盗まれる)理由:

nポイントの数であり、pは、非有する主成分の数その後寸法及びn≤pの数である場合ゼロ分散はn(生データでPCAを実行している場合)またはn-1(中央のデータでPCAを実行している場合 - 通常通り)を超えることはできません

関連する問題